NextPDF'i sunucusuz platformlarda çalıştırma
Bir bakışta
“Bir bakışta” başlıklı bölümYerel, süreç içi NextPDF çekirdek motoru, neredeyse ideal bir sunucusuz iş
yüküdür. Bu, sürecinizin içinde çalışan saf PHP’dir —
composer require nextpdf/core, bir belge oluştur, baytları al. Doğurtulacak
harici bir ikili,
başsız bir tarayıcı, ayakta tutulacak bir artalan süreci ya da bir yan hizmete
giden bir soket yoktur. PDF oluşturan bir işlev soğuk başlar, PHP’nizi çalıştırır,
baytları döndürür ve çıkar. Bu, (Bref çalışma zamanı aracılığıyla) AWS Lambda’ya,
Google Cloud Run’a ve AWS App Runner’a temiz biçimde eşlenir.
Bu sayfa, o yerel motoru bu üç çalışma zamanına dağıtmayı ve dayattıkları küçük, gerçek kısıt kümesini kapsar:
- çalışma zamanı dosya sistemi kalıcı değildir: Lambda yalnızca yazılabilir
bir
/tmpgarantisi verirken, kapsayıcı çalışma zamanlarının (Cloud Run, App Runner) geçici, kapsayıcı kapsamında bir dosya sistemi vardır — her iki durumda da yazı tipleri dağıtım paketinin ya da görüntünün içinde seyahat etmeli ve PHP’de kaydedilmelidir (motor hiçbir yazı tipi yolu ortam değişkenini okumaz); - soğuk başlatmalar otomatik yükleme ve herhangi bir yazı tipi ısınması için
bedel öder; bu nedenle
FontRegistry’yi her çağrıda değil, kapsayıcı başına bir kez ısıtın; - paket boyutu, bellek ve zaman aşımı, önemsiz bir isteğe göre değil, oluşturmaya göre boyutlandırılmalıdır.
Bu sayfa yalnızca yerel motor içindir. Chrome köprüsü (önerilen
nextpdf/artisan paketi aracılığıyla writeHtmlChrome) farklı, daha ağır bir
hikayedir: symfony/process aracılığıyla başsız bir Chromium’a kabuk açar;
sıradan bir Lambda zip’i ya da ince bir kapsayıcı bunu içermez. Chromium’u
Lambda’da çalıştırmak; tarayıcıyı ve paylaşılan kitaplıklarını içeren özel bir
katman, çok daha büyük paketler ve çok daha uzun soğuk başlatmalar demektir —
burada kapsam dışındadır. Yalın motorun bunların hiçbirine ihtiyacı yoktur.
Başlamadan önce şu parçaların yerinde olduğunu doğrulayın:
- Uygulamanızın, bağımlılık olarak
nextpdf/coreile birlikte gönderime alınmış bircomposer.jsonvecomposer.lockdosyası var. - Gömmeyi düşündüğünüz yazı tipi dosyalarına sahipsiniz ve bunları gömmek için lisanslısınız.
- Hedefiniz için araç zincirine sahipsiniz — Lambda için Bref CLI ve
serverlessçerçevesi ya da Cloud Run / App Runner için bir kapsayıcı yapısı.
Yerel motor sunucusuz ortama neden uyar
“Yerel motor sunucusuz ortama neden uyar” başlıklı bölümDoğrudan paketten okunduğunda, nextpdf/core php: >=8.4 <9.0 ile küçük bir PHP
uzantısı kümesi gerektirir — ext-mbstring, ext-intl, ext-gd, ext-openssl,
ext-zlib ve ext-curl. Standart Bref PHP katmanları bunların her birini
paketler. Resmi php:8.4 kapsayıcı görüntüleri openssl, curl ve zlib’i
kutudan çıkar çıkmaz sağlar; ancak mbstring, gd ve intl paketlenmiş
değildir — bunlar, sistem bağımlılıklarını kurmayı ve uzantıları
docker-php-ext-install ile etkinleştirmeyi gerektirir (bkz.
Docker dağıtım kılavuzu).
Bref’te derlenecek egzotik bir şey yoktur; kapsayıcı yolunda, yalın motor için
o üç uzantıyı görüntü yapısında etkinleştirirsiniz.
Uyumu temiz kılan şey, motorun yapmadığı şeydir:
- Çekirdek yol için alt süreç yok. Bir belge oluşturmak ve
getPdfData()çağırmak baştan sona süreç içi PHP’dir.symfony/processbağımlılığı, yerel işleme için değil, isteğe bağlı Chrome köprüsü için vardır — yerel PDF üretimi asla bir süreç doğurmaz. - Kalıcı durum yok. Her çağrı taze bir belge oluşturur ve baytları döndürür. Sıcak kapsayıcı dışında istekler arasında hiçbir şeyin hayatta kalması gerekmez; o kapsayıcıyı yazı tipi ısınması için (aşağıda) değerlendirirsiniz ama doğruluk için ona asla güvenmezsiniz.
- Yazılabilir çalışma dizini gerekmez. Motor PDF’i bellekte oluşturur ve onu
bir dize olarak döndürür; diske yalnızca siz
save()çağırırsanız dokunur. Sunucusuz ortamda bunu yapmazsınız — baytları döndürürsünüz — bu yüzden kalıcı bir dosya sistemi eksikliği, oluşturma yolunu asla ısırmaz.
Tek sert kısıt: kalıcı, yazılabilir dosya sistemi yok
“Tek sert kısıt: kalıcı, yazılabilir dosya sistemi yok” başlıklı bölümDağıtım dosya sistemi kalıcı değildir, ama model çalışma zamanına göre değişir.
AWS Lambda yalnızca yazılabilir bir /tmp garantisi verir (varsayılan olarak
512 MB, 10 GB’a kadar yapılandırılabilir); işlev dosya sisteminin geri kalanı salt
okunurdur. Kapsayıcı çalışma zamanlarının (Cloud Run, App Runner) yalnızca
/tmp modeli yerine geçici, kapsayıcı kapsamında yazılabilir bir dosya sistemi
vardır — ama oraya yazılan her şey kapsayıcı geri dönüştürüldüğünde kaybolur; bu
nedenle o bir depolama değil, karalama alanıdır. Her durumda, hazırlık için
/tmp’yi ya da yapılandırılmış bir birimi tercih edin ve uygulama görüntüsü
yoluna yapılan yazmalara asla kalıcı depolama olarak güvenmeyin. Bundan iki sonuç
çıkar.
Kalıcı çıktı beklentisiyle asla save() çağırmayın. NextPDF\Core\Document
hem save(string $path): void hem getPdfData(): string sunar. Sunucusuz
ortamda getPdfData() kullanır ve baytları döndürür ya da yüklersiniz — uygulama
dizinine yapılan bir yazmayı kalıcı depolama olarak görmeyin. Bir dosyayı
hazırlamanız gerekiyorsa (örneğin nesne depolamasına çok parçalı yükleme için),
/tmp (ya da yapılandırılmış bir birim) altına yazın ve temizleyin; sıcak bir
kapsayıcıda bu karalama alanının çağrılar arasında kalıcı olduğunu ve boyut
sınırına sayıldığını unutmayın.
use NextPDF\Core\Document;
// Right for serverless: get the bytes, return or upload them.$pdf = $document->getPdfData(); // string of PDF bytes, built in memory
// Avoid on serverless: save() writes to disk. On Lambda the application// directory is read-only; on Cloud Run / App Runner it is writable but// ephemeral (lost on container recycle). Neither is durable storage.// $document->save('/var/task/out.pdf'); // not durable — return the bytes insteadÇalışma zamanında işletim sistemi yazı tipleri kurmayın ve otomatik yazı tipi
keşfine güvenmeyin; üretim için yazı tipi dosyalarınızı paketleyin. Lambda’da
salt okunur dosya sistemi apt-get install fonts-* çağrısını doğrudan engeller;
bir kapsayıcı çalışma zamanında ise herhangi bir çalışma zamanı kurulumu geçici
bir dosya sistemine iner ve bir sonraki geri dönüşümde kaybolur. Zaten yardımcı
da olmazdı; çünkü yerel motor hiçbir işletim sistemi/fontconfig yazı tipi okumaz
— yalnızca kaydettiğiniz dosyalardan yazı tiplerini çözer. Bu yüzden üretim için
yazı tipi dosyaları dağıtım yapıtının içinde gönderilmelidir. Kasıtlı olarak yazı
tipi dosyalarını /tmp’ye ya da yapılandırılmış bir birime getirirseniz, bunları
yazı tipi sicilinde açıkça kaydetmeniz ve eklenen soğuk başlatma ile güvenilirlik
maliyetini kabul etmeniz gerekir — bu, önerilen bir üretim örüntüsü değildir.
Yazı tiplerini pakette veya görüntüde paketleyip kaydedin
“Yazı tiplerini pakette veya görüntüde paketleyip kaydedin” başlıklı bölümYerel motor yazı tiplerini, fontconfig’ten ya da işletim sistemine kurulu yazı
tiplerinden değil, NextPDF\Typography\FontRegistry aracılığıyla yazı tipi
dosyalarından çözer. Sunucusuz ortamda bu pazarlık konusu değildir: dağıtımdan
sonra yazı tiplerini koyacak kalıcı bir dosya sistemi yoktur; bu nedenle bunlar
paketin (bir Lambda zip’i ya da katmanı) ya da görüntünün (Cloud Run / App
Runner) içinde gönderilir.
.ttf / .otf / .ttc dosyalarınızı projenizdeki bir dizin altında —
resources/fonts/ yaygın kuraldır — paketleyin; böylece yapıta dahil edilirler.
Sonra o dizini PHP’de kaydedin. Motor hiçbir yazı tipi yolu ortam değişkenini
okumaz: NEXTPDF_FONTS_PATH, nextpdf/laravel paketinin fonts_path yapılandırma
anahtarının varsayılan değeridir (env('NEXTPDF_FONTS_PATH', resource_path('fonts')))
ve yalnızca o çerçeve tümleştirmesi tarafından tüketilir, nextpdf/core
tarafından değil. Yalın bir işlev, sicili paketlenmiş dizinle kurmalıdır:
use NextPDF\Typography\FontRegistry;use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;
// Register the directory the deployment artifact bundled the fonts into.// On Lambda/Bref the code root is /var/task; adjust for your runtime.$registry = new FontRegistry(__DIR__ . '/resources/fonts');// (equivalently, $registry->addFontDirectory(__DIR__ . '/resources/fonts');)
$factory = new DocumentFactory($registry, new ImageRegistry(maxCacheBytes: 0));$document = $factory->create();Yazı tipleri için bütün sunucusuz endişesi budur. Dosya adlandırma kuralları, tam sicil API’si ve kalıcı olmayan dosya sistemi işlenmesi özel sayfada yaşar — bunları burada yinelemeyin. Üretimde yerel motor için yazı tipleri sağlama sayfasını eksiksiz örüntü için okuyun ve paketlediğiniz dizinin aynısını kaydedin. Docker dağıtım kılavuzu, Cloud Run / App Runner durumu için eşdeğer görüntü tarafı paketlemeyi kapsar.
Soğuk başlatmalar: FontRegistry’yi kapsayıcı başına bir kez ısıtın
“Soğuk başlatmalar: FontRegistry’yi kapsayıcı başına bir kez ısıtın” başlıklı bölümBir soğuk başlatma; PHP önyüklemesi, Composer’ın iyileştirilmiş otomatik yükleyicisi ve ilk oluşturmanın tetiklediği herhangi bir yazı tipi ayrıştırması için bedel öder. Önyüklemeden kaçınamazsınız ama yazı tipi işini sıcak yoldan çıkarıp sıcak çağrılar arasında yeniden kullanabilirsiniz.
FontRegistry ve DocumentFactory’yi bir kez, işleyicinin dışında kurun;
böylece kapsayıcının ömrü boyunca yaşar ve her sıcak çağrıda yeniden kullanılır.
İsteğe bağlı olarak, kullanacağınızı bildiğiniz yazı tipi dosyalarıyla warmup()
çağırın; böylece bunlar ilk işleme sırasında değil, başlatma sırasında
ayrıştırılır; sonra sicili lock() ile kilitleyin; böylece ayrıştırılmış durumu
donar ve hiçbir çağrı başına değişiklik yarışamaz:
use NextPDF\Typography\FontRegistry;use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;
// Container-scoped, built once at cold start (module scope, not per request).$fontsDir = __DIR__ . '/resources/fonts';$registry = new FontRegistry($fontsDir);
// Parse the fonts you will actually use now, so the first render does not.$registry->warmup([ $fontsDir . '/liberation/LiberationSans-Regular.ttf', $fontsDir . '/liberation/LiberationSans-Bold.ttf',]);
// Freeze the parsed state for the life of the warm container.$registry->lock();
$factory = new DocumentFactory($registry, new ImageRegistry(maxCacheBytes: 0));
// Each invocation: fresh document from the shared, warm factory.$handler = static function (array $event) use ($factory): string { $document = $factory->create(); $document->addPage(); $document->cell(0, 10, 'Hello from serverless', newLine: true);
return $document->getPdfData();};warmup()’ı lock()’tan önce çağırın — sicil bir kez kilitlendiğinde donar;
bu nedenle ondan sonra yapılan bir ısınma bir yapılandırma hatası yükseltir.
Isınmada yüklenmeyen bir yazı tipini bir çalışma zamanı ayrıntısı değil, bir
dağıtım zamanı hatası olarak ele alın: ısıtmayı düşündüğünüz her yazı tipi
yolunun başlangıçta gerçekten var olup ayrıştığını doğrulayın ve yanlış yazılmış
bir yolun sonradan eksik glifler olarak yüzeye çıkmasına izin vermek yerine,
biri var olmazsa dağıtımı (ya da sağlık denetiminizi) başarısız kılın. Isınma
listesini tipik bir çağrının ihtiyaç duyduğu yazı tipleriyle sınırlı tutun;
nadiren kullandığınız büyük bir aileyi ısıtmak yalnızca her soğuk başlatmayı
uzatır.
AWS Lambda’da bir Bref işlevi
“AWS Lambda’da bir Bref işlevi” başlıklı bölümBref, Lambda için PHP çalışma zamanını yayımlanmış bir katman
ve bir serverless.yml eklentisi olarak sağlar. php-84 çalışma zamanı,
nextpdf/core’un ihtiyaç duyduğu uzantıları zaten gönderir; bu nedenle kodunuzu
ve yazı tiplerinizi dağıtır ve bir işlevi bir işleyiciye yönlendirirsiniz. Küçük
bir serverless.yml:
service: nextpdf-serverless
provider: name: aws region: us-east-1 runtime: provided.al2023
plugins: - ./vendor/bref/bref
functions: generate: handler: handler.php description: Generate a PDF with the native NextPDF engine runtime: php-84 memorySize: 1024 # size to the build; see "Sizing" below timeout: 30 # seconds; raise for large documents # The Lambda filesystem is read-only except /tmp. Fonts ship in the # package under resources/fonts and are registered in the handler.İşleyici, belgeyi sıcak, kapsayıcı kapsamındaki fabrikayla oluşturur ve baytları
döndürür. Bir HTTP API için, API Gateway’in gövdeyi ikili olarak ele alması
amacıyla bunları application/pdf içerik türüyle base64 olarak kodlanmış
döndürün; bir invoke ya da kuyruk tetikleyicisi için, baytları nesne depolamasına
yükleyin ve anahtarı döndürün:
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Typography\FontRegistry;
// --- Cold-start: built once per container, reused across warm invocations. ---$fontsDir = __DIR__ . '/resources/fonts';$registry = new FontRegistry($fontsDir);$registry->warmup([$fontsDir . '/liberation/LiberationSans-Regular.ttf']);$registry->lock();$factory = new DocumentFactory($registry, new ImageRegistry(maxCacheBytes: 0));
// --- Per-invocation handler. ---return static function (array $event) use ($factory): array { $document = $factory->create(); $document->addPage(); $document->cell(0, 10, 'Invoice', newLine: true);
// getPdfData() materializes the whole PDF in memory and returns it. $bytes = $document->getPdfData();
return [ 'statusCode' => 200, 'isBase64Encoded' => true, 'headers' => ['Content-Type' => 'application/pdf'], 'body' => base64_encode($bytes), ];};Trafiği ona bağlamadan önce paketin sağlıklı bir ortam içerdiğini doğrulayın.
nextpdf/core, vendor/bin/nextpdf konumuna kurulu bir CLI gönderir; bunun
doctor komutu, tam olarak motorun ihtiyaç duyduğu uzantıları bildirir. PHP 8.4
ile gerekli her uzantının var olduğunu onaylamak için aynı çalışma zamanı
görüntüsüne ya da katmanına karşı bunu bir kez çalıştırın.
Cloud Run ve App Runner
“Cloud Run ve App Runner” başlıklı bölümCloud Run ve App Runner, zip’lenmiş bir işlev yerine bir kapsayıcı çalıştırır;
bu nedenle yapı, bir Bref paketi değil,
Bir NextPDF uygulamasını kapsayıcılaştırma
sayfasındaki Docker görüntüsüdür. Yerel motor kısıtları aynıdır: yazı tiplerini
görüntüye paketleyin, paketlenmiş dizini PHP’de kaydedin, ayrıcalıksız çalıştırın
ve dosya sistemini kalıcı olmayan olarak ele alın. Lambda’nın yalnızca /tmp
modelinin aksine, bir Cloud Run / App Runner kapsayıcısının geçici, kapsayıcı
kapsamında yazılabilir bir dosya sistemi vardır — ama bu her geri dönüşümde
sıfırlanır; bu yüzden karalama için /tmp’yi (Cloud Run’da bir tmpfs) ya da
yapılandırılmış bir birimi kullanın ve uygulama görüntüsü yoluna yapılan yazmalara
asla kalıcı depolama olarak güvenmeyin.
Lambda’dan farklar yapısal değil, işletimseldir:
- Kapsayıcı, istekler arasında sıcak kalabilir — bir eşzamanlılık ayarı
altında; böylece yukarıdaki kapsayıcı kapsamlı
FontRegistry/DocumentFactoryısınması yalnızca bir sonraki çağrıda değil, birçok istek boyunca karşılığını verir. - HTTP üzerinden hizmet verirsiniz (bir FPM ya da yerleşik PHP sunucu SAPI’si) — bir invoke olayı yerine; böylece baytları çerçevenizin yanıtı aracılığıyla döndürürsünüz. Büyük bir belge için bunları akışla iletilen bir yanıt olarak döndürün — bkz. Büyük, oluşturulmuş bir PDF’i HTTP yanıtı olarak akışla iletme.
- İstek zaman aşımı ve bellek, işlev başına değil, hizmet üzerinde ayarlanır (Cloud Run hizmet zaman aşımı / belleği; App Runner örnek yapılandırması).
Diğer her şey — uzantı kümesi, yazı tipi kaydı, getPdfData() çıktı çağrısı —
Lambda işleyicisiyle aynı koddur.
Boyutlandırma: paket, bellek ve zaman aşımı
“Boyutlandırma: paket, bellek ve zaman aşımı” başlıklı bölüm- Paket ve görüntü boyutu. Yapıt,
vendor/’ı (yalnızca üretim —--no-devile kurun) ve paketlediğiniz yazı tiplerini taşır. Yazı tipleri başattır: tam bir CJK ailesi onlarca megabayttır. Lambda paketini sınırlarının altında ve görüntüyü küçük tutmak için yalnızca gerçekten işlediğiniz yazı tiplerini gönderin; bu, soğuk başlatmaları da kısaltır. Paketlenmiş Liberation ailesi (resources/fonts/liberation/) küçüktür ve metrik uyumlu Helvetica değişimini kapsar. - Bellek.
getPdfData(), belgenin tamamını bellekte oluşturur ve onu tek bir dize olarak döndürür; bu nedenle tepe bellek, kabaca bitmiş bir PDF’in boyutu artı oluşturmanın çalışma kümesidir. İşlev/kapsayıcı belleğini ortalamaya değil, ürettiğiniz en büyük belgeye göre boyutlandırın. Lambda’da bellek aynı zamanda CPU’yu ölçeklendirir; bu nedenle daha fazla bellek, daha yüksek milisaniye başına oran rağmen genellikle daha hızlı bir oluşturma ve daha ucuz bir çalıştırma demektir — her ikisini de ölçün. Birkaç sayfalık bir belge 512–1024 MB’da rahattır; görüntü ağırlıklı ya da çok sayfalı belgeler daha fazlasını gerektirir. - Zaman aşımı. İstek bütçesine, aktarım değil, oluşturma egemen olur. İşlev zaman aşımını, en kötü durum oluşturma süresinin paylı olarak üstüne ayarlayın. Bir belge zaman aşımı riski taşıyacak kadar büyükse, oluşturmayı, sonucu eşzamanlı bir isteği engellemek yerine nesne depolamasına yazan eşzamansız bir tetikleyiciye (kuyruk destekli bir Lambda ya da bir Cloud Run işi) taşıyın.
/tmpboyutu./tmpaltında bir şey hazırlarsanız, boyut sınırını hesaba katın ve bunun sıcak çağrılar arasında kalıcı olduğunu unutmayın — temizleyin, yoksa uzun ömürlü bir kapsayıcı onu yavaşça doldurur.
Uç durumlar ve dikkat edilecek noktalar
“Uç durumlar ve dikkat edilecek noktalar” başlıklı bölüm- Uygulama dizinine kalıcı
save()yok. Dağıtım dosya sistemi kalıcı değildir — Lambda’nın uygulama dizini salt okunurdur (yalnızca/tmpyazma kabul eder) ve bir Cloud Run / App Runner kapsayıcı dosya sistemi yazılabilir ama geçicidir.getPdfData()kullanın ve baytları döndürün/yükleyin; gerekiyorsa/tmpaltına ya da yapılandırılmış bir birime hazırlayın. - Otomatik yazı tipi keşfine güvenmeyin. Çalışma zamanında işletim sistemi
yazı tipleri kurmayın ve otomatik yazı tipi keşfine güvenmeyin; üretim için
yazı tipi dosyalarınızı paketleyin. Yerel motor hiçbir işletim sistemi/fontconfig
yazı tipi okumaz — yalnızca kaydettiğiniz dosyaları çözer. Kasıtlı olarak yazı
tipi dosyalarını
/tmp’ye ya da yapılandırılmış bir birime getirirseniz, bunları yazı tipi sicilinde açıkça kaydetmeniz ve eklenen soğuk başlatma ile güvenilirlik maliyetini kabul etmeniz gerekir. Dosyaları paketleyin ve kaydedin. Yukarıda bağlantısı verilen yazı tipleri sayfasına bakın. NEXTPDF_FONTS_PATHyalın motor için hiçbir şey yapmaz. Bu,nextpdf/laravelyapılandırma varsayılanıdır;nextpdf/core’un okuduğu bir değişken değildir. Yalnızca o değişkeni ayarlayan yalın bir Bref işleyicisi hiçbir yazı tipi kaydetmez ve tofu işler.- Chrome köprüsü sıradan bir işleve sığmaz.
writeHtmlChrome, başsız bir Chromium vesymfony/processalt süreç yolu gerektirir. Chromium’u Lambda’ya koymak; tarayıcıyı ve kitaplıklarını içeren özel bir katman, çok daha büyük paketler ve uzun soğuk başlatmalar gerektirir. Yerel motor vewriteHtmlbunların hiçbirine ihtiyaç duymaz — sunucusuz ortamda onları tercih edin. - Soğuk başlatma maliyeti, otomatik yükleme artı yazı tipi ayrıştırmasıdır.
Üretim kurulumunda
--optimize-autoloaderkullanın ve sicili kapsayıcı başına bir kez ısıtın. Nadiren kullandığınız yazı tiplerini ısıtmayın. - API Gateway ikili işleme gerektirir.
Content-Type: application/pdfileisBase64Encoded: truedöndürün ve API’yiapplication/pdf’i bir ikili ortam türü olarak ele alacak biçimde yapılandırın; yoksa istemci bozuk baytlar alır. - Premium ve ionCube daha ağır bir yapıt endişesidir. ionCube ile kodlanmış NextPDF Pro / Enterprise yapıları, çalışma zamanındaki tam PHP yapısıyla eşleşen ionCube Loader’a ihtiyaç duyar; stok bir Bref katmanı bunu içermez. Bu, bir çekirdek sunucusuz dağıtımı için kapsam dışındadır.
Güvenlik notları
“Güvenlik notları” başlıklı bölüm- Hiçbir geliştirme bağımlılığı göndermeyin. Test ve analiz araçlarının işlev
paketine ya da görüntüye asla girmemesi için
--no-devile kurun. - Oluşturmadan önce girdiyi doğrulayın. İstek girdisiyle sürülen bir PDF oluşturma, bir bellek tüketimi vektörüdür; herhangi bir oluşturma işi çalışmadan önce sınırdaki aralık dışı ya da aşırı büyük girdileri reddedin ve yüksek trafiğin tepe belleği bir bellek yetmezliği başarısızlığına katlamaması için eşzamanlılığı sınırlayın.
- Yazı tiplerini ve lisansları genel yapıtların dışında tutun. Yalnızca gömmek için lisanslı olduğunuz yazı tiplerini paketleyin ve bir premium lisans dosyasını asla herkese açık olarak gönderilmiş bir görüntüye ya da katmana pişirmeyin — bunun yerine onu çalışma zamanında bir ortam değeri ya da gizli yöneticisi aracılığıyla sağlayın.
- En az ayrıcalık. İşleve/hizmete yalnızca ihtiyaç duyduğu IAM izinlerini verin (örneğin, tek çıktı paketine yazma erişimi) ve kapsayıcıyı Docker kılavuzunun gösterdiği gibi ayrıcalıksız çalıştırın.
Uygunluk
“Uygunluk” başlıklı bölümBu kılavuz hiçbir normatif standart iddiasında bulunmaz. Platform gerçekleri
doğrudan nextpdf/core paketinden okunur: php: >=8.4 <9.0 kısıtı ve gerekli
uzantılar ext-mbstring, ext-intl, ext-gd, ext-openssl, ext-zlib ve
ext-curl. Standart Bref PHP-8.4 çalışma zamanı katmanı altısını da paketler;
resmi php:8.4 görüntüsü openssl, curl ve zlib’i sağlar, ama mbstring,
gd ve intl, görüntü yapısında docker-php-ext-install ile kurulmalı ve
etkinleştirilmelidir (bkz. Docker sayfası). Çıktı çağrısı, gerçek çekirdek yüzeyi
NextPDF\Core\Document::getPdfData(): string’dir (disk kardeşi
save(string $path): void’dur). Yazı tipleri NextPDF\Typography\FontRegistry
aracılığıyla kaydedilir — dizin kurucu bağımsız değişkeni / addFontDirectory(),
soğuk başlatma örüntüsü için warmup(array $fontFiles) ve lock() ile — ve
NextPDF\Core\DocumentFactory::create() aracılığıyla bağlanır. NEXTPDF_FONTS_PATH,
nextpdf/laravel paketinin fonts_path yapılandırma anahtarıdır
(env('NEXTPDF_FONTS_PATH', resource_path('fonts'))), nextpdf/core’un okuduğu
bir değişken değildir. nextpdf CLI doctor komutu, pakette
"bin": ["bin/nextpdf"] olarak bildirilir ve tüketen bir uygulamada
vendor/bin/nextpdf konumuna kurulur. Bref çalışma zamanı adları ve AWS Lambda /
Cloud Run / App Runner davranışları, o satıcıların belgelenmiş özellikleridir.
Ayrıca bkz.
“Ayrıca bkz.” başlıklı bölüm- Bir NextPDF uygulamasını kapsayıcılaştırma: Cloud Run / App Runner hedefleri için kullanılan üretim görüntüsü.
- Üretimde yerel motor için yazı tipleri sağlama: bu sayfanın dayandığı yazı tipi dosyası adlandırması, sicil API’si ve ısıt-ve-kilitle örüntüsü.
- Büyük, oluşturulmuş bir PDF’i HTTP yanıtı olarak akışla iletme: Cloud Run / App Runner üzerinde HTTP üzerinden oluşturulmuş bir belge döndürmenin bellek modeli.
- Cloudflare ile uçta işleme: süreç içi bir işlev doğru çalışma zamanı olmadığında.