İçeriğe geç
getnextpdf.com

NextPDF'i sunucusuz platformlarda çalıştırma

Yerel, 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’dircomposer 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 /tmp garantisi 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/core ile birlikte gönderime alınmış bir composer.json ve composer.lock dosyası 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ı.

Doğ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/process bağı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üm

Dağı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üm

Yerel 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üm

Bir 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.

Bref, 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:

handler.php (outline)
<?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, 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.

  • Paket ve görüntü boyutu. Yapıt, vendor/’ı (yalnızca üretim — --no-dev ile 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.
  • /tmp boyutu. /tmp altı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.
  • Uygulama dizinine kalıcı save() yok. Dağıtım dosya sistemi kalıcı değildir — Lambda’nın uygulama dizini salt okunurdur (yalnızca /tmp yazma 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 /tmp altı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_PATH yalın motor için hiçbir şey yapmaz. Bu, nextpdf/laravel yapı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 ve symfony/process alt 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 ve writeHtml bunları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-autoloader kullanı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/pdf ile isBase64Encoded: true döndürün ve API’yi application/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.
  • 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-dev ile 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.

Bu 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.