Laravel tərtibatçıları üçün ən populyar HTML-dən şəkil yaratma paketi olan Browsershot, əslində, arxa planda Puppeteer vasitəsilə real Chrome brauzerini işə salır. Yerli maşında hər şey qüsursuz işləsə də, deploment edən kimi “Failed to launch the browser process!” xətası ilə qarşılaşmaq adi haldır. Problem Browsershot'un kodunda deyil, onun işlədiyi mühitdədir.
İstehsal mühitində Browsershot'u işə salmaq üçün Node.js, Puppeteer npm paketi, Chrome və ya Chromium ikili faylı, Chrome'un bağlı olduğu bütün kitabxanalar (libnss3, libatk, libgbm və s.) və geniş şrift dəsti lazımdır. Bu, tam nəzarət etdiyiniz VPS-də idarəoluna bilər, amma Laravel tətbiqləri getdikcə daha çox serverless mühitlərdə – Laravel Vapor, paylaşılan hostinqlər, nazik Docker imiclərində işləyir. Məhz həmin yerlərdə Browsershot işləmir: Vapor Lambda'da Node.js yoxdur, paylaşılan hostingdə root icazəniz yoxdur, Alpine əsaslı Docker imicinə Chrome'u əlavə etmək isə yüzlərlə meqabayt və daimi texniki xidmət deməkdir.
İki ənənəvi həll var: ya Chrome'un bütün asılılıqlarını konteynerə yığıb yaddaş problemləri ilə yaşamaq, ya da ayrıca Node Lambda funksiyası yaradıb Browsershot'u ora köçürmək (sidecar yanaşması). Hər ikisi işləyir, amma hər ikisi əlavə mürəkkəblik və xərc gətirir. Üçüncü variant isə brauzeri öz serverinizdə saxlamaqdan tamamilə imtina etməkdir.
html2img – API əsaslı həll
“Html2img” adlı rəsmi Laravel paketi, Chrome'u API tərəfə keçirir. Sizə sadəcə composer require html2img/html2img-laravel əmri ilə paketi yükləmək və HTML2IMG_API_KEY ətraf dəyişənini təyin etmək kifayətdir. Bütün render işləri real Chrome'da, lakin API tərəfdə baş verir. Nəticədə çıxan şəkil keyfiyyəti Browsershot'dan heç fərqlənmir – eyni flexbox, grid, veb şriftlər, JavaScript işləyir. Sadəcə brauzer artıq sizin serverdə deyil.
Köhnə Browsershot kodundan köçmək də asandır. Məsələn, Browsershot ilə dinamik Open Graph şəkli yaratmaq üçün:
use Spatie\Browsershot\Browsershot; Browsershot::html(view('og.post', ['post' => $post])->render()) ->windowSize(1200, 630) ->save(storage_path("app/og/{$post->id}.png"));Eyni işi html2img ilə belə edirsiniz:
use Html2img\Laravel\Facades\Html2img; use Html2img\Request\HtmlRequest; $response = Html2img::html(new HtmlRequest( html: view('og.post', ['post' => $post])->render(), width: 1200, height: 630, )); $path = Html2img::store($response, "og/{$post->id}.png");store() metodu şəkli yükləyib istənilən Laravel fayl sisteminə (lokal və ya S3) yazır. İstəsəniz, birbaşa API-nin qaytardığı CDN URL-dən də istifadə edə bilərsiniz. Paket həmçinin canlı URL-lərdən skrinşot götürməyi, müəyyən CSS seçicilərinə kəsməyi və tip-fərqli xəta idarəçiliyini dəstəkləyir.
Təbii ki, API heç vaxt hər şeyin həlli deyil. Əgər müəssisə qaydaları xarici xidmətə HTML göndərməyi qadağan edirsə, brauzeri özünüz idarə etməli olacaqsınız. PDF çıxışı, yüksək həcmli davamlı render və ya öz ops komandanız varsa, Browsershot daha sərfəli ola bilər. Amma əksər hallarda, serverdə brauzer saxlamaq, sadəcə, vergidir – Dockerfile sətirləri, yaddaş ehtiyatı, Chromium yeniləmələrindən sonra 2'də oyanmaq ilə ödənilir. Bir paket və API açarı ilə bu vergini başqasına ötürə bilərsiniz.



