Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

shadkamel's avatar

shadkamel liked a comment+100 XP

1mo ago

shadkamel's avatar

shadkamel wrote a reply+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

thanks for your explanation i really appreciate it, it was so clear to me i think it will work fine and it will help other to fix their issues, for the next time i will try all you said, i will replay my feedback on it.

thank you again.

shadkamel's avatar

shadkamel liked a comment+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

I know you already switched to dompdf, but if you ever need modern CSS (flexbox/grid) back, here is the actual solution. The AI completely missed the root cause.

The specific error not a snap cgroup happens because recent Ubuntu versions on Forge install Chromium as a Snap package. Snap's strict AppArmor/cgroup confinement blocks it from being executed by daemon services like php-fpm. Running config:cache likely just triggered a worker/FPM restart that temporarily masked the issue before the cgroup restrictions clamped down again.

To fix it permanently, you need to ditch the Snap version entirely and install the native Google Chrome binary.

SSH into Forge and nuke the snap version:

sudo snap remove chromium

Install the native Google Chrome package:

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update
sudo apt-get install -y google-chrome-stable

Update your PDF generation:

return Pdf::view('PDF.invoice', compact('invoice'))
    ->format('a4')
    ->landscape()
    ->name("{$invoice->invoice_no}-{$invoice->created_at->format('Y-m-d')}.pdf")
    ->withBrowsershot(function ($browsershot) {
        $browsershot->setChromePath('/usr/bin/google-chrome-stable')
                    ->addChromiumArguments(['--no-sandbox', '--disable-setuid-sandbox']);
    })
    ->download();

Dompdf is fine for basic tables, but applying this fix takes 2 minutes and gets Spatie/Browsershot running flawlessly on Forge forever.

shadkamel's avatar

shadkamel wrote a reply+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

thank you for your replay, i used all AI chats for solving this problem but it doesn't helpfull, so i switched to dompdf.

shadkamel's avatar

shadkamel liked a comment+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

Best bet would be to use use chatgpt and follow through. And give it every error that you get. I was able to use it twice to get browsershot working on a web app running in forge. Better still you can checkout or use https://github.com/barryvdh/laravel-dompdf

shadkamel's avatar

shadkamel wrote a reply+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

i think browsershot will never work for me.

shadkamel's avatar

shadkamel started a new conversation+100 XP

1mo ago

Laravel-PDF with Browsershot Exception on laravel forge

hello, i have used the spatie laravel pdf for generating an invoice that work with browsershot, every thing is working in locale and production (laravel forge), after an hour or maybe two, the pdf generator will crash on production, here is the error:

The command "PATH=$PATH:/usr/local/bin NODE_PATH="/home/forge/sl-trucks.com/releases/67020047/node_modules" "/usr/bin/node" '/home/forge/sl-trucks.com/releases/67020047/vendor/spatie/browsershot/src/../bin/browser.cjs' '-f file:///home/forge/sl-trucks.com/releases/67020047/storage/temp/943269296-0594054001775539573/command.js'" failed. Exit Code: 1(General error) Working directory: /home/forge/sl-trucks.com/releases/67020047/public Output: ================ Error Output: ================ Error: Failed to launch the browser process: Code: 1 stderr: /system.slice/php8.4-fpm.service is not a snap cgroup for tag snap.chromium.chromium TROUBLESHOOTING: https://pptr.dev/troubleshooting at ChildProcess.onClose (/home/forge/sl-trucks.com/releases/67020047/node_modules/@puppeteer/browsers/lib/cjs/launch.js:350:24) at ChildProcess.emit (node:events:531:35) at ChildProcess._handle.onexit (node:internal/child_process:293:12) 

when i run php artisan config:cache it will work again for two house then it will crash again, does any one have a clue how to solve this problem?

here is an example of the controller method:

return Pdf::view('PDF.invoice', compact('invoice'))
            ->format('a4')
            ->landscape()
            ->name("{({$invoice->invoice_no})-{$invoice->created_at->format('Y-m-d')}.pdf")
            ->download();
shadkamel's avatar

shadkamel wrote a comment+100 XP

1mo ago

Intricacies of Sending an Invoice: Ep 1, How to Convert HTML to PDF

i think i watched this video for 4 years and still it deosn't worked for me.

shadkamel's avatar

shadkamel wrote a comment+100 XP

1mo ago

Debugging Real-World Production Nightmares: Ep 2, Death By N+1 Queries

there is another tool that can be useful just like laravel debugbar which is clockwork, i so usefull if you want to debug api requests which tell you memoery usage, models, queries and more.

here is the link: https://underground.works/clockwork/

shadkamel's avatar

shadkamel wrote a comment+100 XP

4mos ago

Jeffrey's Larabits: Ep 51, Build Your First Telegram Bot In Record Time

that was great, i have never thought that will be so easy like that.

shadkamel's avatar

shadkamel liked a comment+100 XP

4mos ago

Jeffrey's Larabits: Ep 51, Build Your First Telegram Bot In Record Time

Quick note! At 13:07, we use the Bot's chat id to compare it to the authorized user id. Technically, this works for a private chat with the Bot. However, we should handle the possibility of group chats and channels by instead fetching the user directly. It's more clear that way, anyhow.

Use $bot->user()->id instead of $bot->chat()->id.

if ($bot->user()->id !== config('nutgram.authorized_user') {
	$bot->sendMessage('You are not authorized to use this bot.');
}
shadkamel's avatar

shadkamel wrote a comment+100 XP

5mos ago

Motion For The Web: Ep 14, Animating Along a Path

that was absolutly insane, this is my first time i see these features in css animations, thank you simon.

shadkamel's avatar

shadkamel wrote a comment+100 XP

5mos ago

Motion For The Web: Ep 1, Why Motion?

here is my fav course <3

shadkamel's avatar

shadkamel wrote a comment+100 XP

5mos ago

The Laravel Workshop: Ep 47, Welcome To Section 3

long time no see, i am glad to see you again.

shadkamel's avatar

shadkamel wrote a comment+100 XP

5mos ago

The Laravel Workshop: Ep 45, Cleaning Up

i think the video edited wrong please check it.