Lewati ke konten
getnextpdf.com

Pro edisi

Output Pipeline — Referensi Mendalam

Halaman ini adalah referensi mendalam untuk permukaan publik NextPDF\Pro\OutputPipeline. Halaman ini mencakup konstruksi dan validasi manifest, urutan eksekusi topologis, semantik retry dan timeout, perilaku resume, serta gerbang kapabilitas pack yang fail-closed. Halaman ini menyatakan parameter, nilai default, dan mode kegagalan untuk setiap simbol publik. Baca halaman kapabilitas Output Pipeline terlebih dahulu untuk panduan alur kerja.

Kapabilitas ini dikirimkan dalam NextPDF Pro (nextpdf/pro) dan diaktifkan dengan license envelope tingkat Pro. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kapabilitas ini. Bandingkan edisi dan dapatkan lisensi.

Executor dan tujuh dari sepuluh tipe langkah tidak membawa flag per-fitur. Tiga tipe langkah tambahan membutuhkan kapabilitas Pack:

Tipe langkahNilai manifestKapabilitas yang dibutuhkanPack
Redactredactpack.privacy.redactPrivacy Pack
Extractextractpack.intelligence.extractIntelligence Pack
OCR overlayocr_overlaypack.intelligence.searchable_pdfIntelligence Pack

Gerbang ini diberlakukan pada waktu eksekusi, fail-closed, sebelum langkah mencapai resolver-nya. Langkah tergerbang tanpa lisensi menghasilkan hasil langkah Failed yang membawa kode SPEC-LIC-001 dan kapabilitas yang dibutuhkan; resolver tidak pernah dipanggil. Pipeline tanpa capability resolver yang di-inject menolak setiap langkah tergerbang.

Terminal window
composer require nextpdf/pro:^3

Metapackage nextpdf/premium memasang kode nextpdf/pro; modul ini berada di dalam namespace NextPDF\Pro\OutputPipeline.

SimbolParameterPerilaku defaultMengembalikanMelempar atau gagal denganCatatan
PipelineExecutor::__constructStepResolverRegistry $registry, ?CapabilityResolverInterface $capabilityResolver = nullMengikat registry resolver bawaan dan sumber entitlement opsionalPipelineExecutorTidak ada yang dideklarasikanCapability resolver bernilai null menolak setiap langkah yang digerbang pack
PipelineExecutor::executePipelineManifest $manifest, array $variables = []Menjalankan langkah dalam urutan topologis dan mengagregasi hasilPipelineResultTidak ada yang dideklarasikan; kegagalan resolver ditangkap sebagai hasil langkah FailedDirancang untuk berjalan di dalam job worker asinkron
PipelineManifest::__constructstring $id, array $steps, PipelineOptions $options = new PipelineOptions(), ?string $resumeFromStepId = nullMemvalidasi graf langkah saat konstruksiPipelineManifestInvalidArgumentException pada daftar langkah kosong, ID langkah duplikat, dependensi tak dikenal, siklus, ketidakcocokan tipe output, atau langkah resume yang hilang; OverflowException di atas 10 000 langkahSemua validasi selesai sebelum eksekusi apa pun
PipelineManifest::topologicalOrdertidak adaMengurutkan langkah dengan dependensi sebelum yang bergantunglist<PipelineStep>Tidak ada yang dideklarasikanDeterministik untuk manifest tertentu
PipelineManifest::getStepstring $stepIdPencarian linear berdasarkan ID langkah?PipelineStepTidak ada yang dideklarasikannull untuk ID tak dikenal
PipelineManifest::rootStepstidak adaMengembalikan langkah yang tidak memiliki dependensilist<PipelineStep>Tidak ada yang dideklarasikanLangkah root berjalan lebih dulu
PipelineManifestBuilder::createstring $manifestIdMemulai builder baruselfTidak ada yang dideklarasikanKonstruktor bersifat private; ini satu-satunya entri
PipelineManifestBuilder::addStepstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], ?StepOutputType $outputType = nullMenambahkan langkah; tipe output null disimpulkan dari tipe langkahselfTidak ada yang dideklarasikanValidasi ditangguhkan ke build()
PipelineManifestBuilder::stopOnErrorbool $stop = trueMengatur halt-on-first-failureselfTidak ada yang dideklarasikanDefault true
PipelineManifestBuilder::maxRetriesint $retriesMengatur batas atas retry per-langkahselfTidak ada yang dideklarasikanDefault 0 (tanpa retry)
PipelineManifestBuilder::timeoutint $timeoutMsMengatur timeout global pipelineselfTidak ada yang dideklarasikan0 menonaktifkan timeout
PipelineManifestBuilder::resumeFromstring $stepIdMengatur titik resumeselfTidak ada yang dideklarasikanLangkah harus ada pada waktu build()
PipelineManifestBuilder::buildtidak adaMengonstruksi manifest yang tervalidasiPipelineManifestSama seperti PipelineManifest::__construct
PipelineOptions::__constructbool $stopOnError = true, int $maxRetries = 0, int $timeoutMs = 0Opsi eksekusi yang immutablePipelineOptionsTidak ada yang dideklarasikanValue object readonly
PipelineStep::__constructstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], StepOutputType $outputType = StepOutputType::PdfDefinisi langkah yang immutablePipelineStepTidak ada yang dideklarasikanKonstruksi langsung menetapkan tipe output ke PDF secara default untuk setiap tipe
PipelineStep::isRoottidak adaTrue ketika langkah tidak memiliki dependensiboolTidak ada yang dideklarasikan
PipelineStepType (enum)Sepuluh case berbasis string: generate, merge, split, inspect, compress, sign, convert, ditambah redact, extract, ocr_overlay yang tergerbangSatu case per operasi bawaan
PipelineStepType::requiresPacktidak adaTrue untuk Redact, Extract, dan OcrOverlayboolTidak ada yang dideklarasikanSemua case lain mengembalikan false
PipelineStepType::requiredCapabilitytidak adaMemetakan case tergerbang ke kode kapabilitasnya?stringTidak ada yang dideklarasikannull untuk case yang tidak tergerbang
PipelineStatus (enum)Lima case: pending, running, completed, failed, cancelledDigunakan bersama oleh hasil pipeline dan langkah
PipelineStatus::isTerminaltidak adaTrue untuk Completed, Failed, dan CancelledboolTidak ada yang dideklarasikanPending dan Running bersifat non-terminal
StepOutputType (enum)Tiga case: pdf, json, metadataMenggerakkan validasi edge pada waktu build
StepOutputType::forStepTypePipelineStepType $stepTypeTipe output default untuk sebuah tipe langkahselfTidak ada yang dideklarasikanInspect dan Extract dipetakan ke JSON; semua tipe lain dipetakan ke PDF
StepOutputType::isCompatibleWithself $expectedInputTrue untuk kecocokan tipe yang sama atau output PDFboolTidak ada yang dideklarasikanHelper; PDF adalah input universal
PipelineContext::__constructstring $manifestId, array $variables = [], ?string $resumeFromStepId = nullKonteks in-memory per-runPipelineContextTidak ada yang dideklarasikanTanpa TTL, kedaluwarsa, persistence, atau backing store
PipelineContext::setStepResult / ::getStepResultstring $stepId (+ StepResult saat set)Merekam atau membaca hasil langkahvoid / ?StepResultTidak ada yang dideklarasikannull untuk langkah yang belum dieksekusi
PipelineContext::setStepOutput / ::getStepOutputstring $stepId (+ mixed saat set)Menyimpan atau membaca output antaravoid / mixedTidak ada yang dideklarasikannull untuk output yang hilang
PipelineContext::hasStepResultstring $stepIdApakah sebuah langkah sudah dieksekusiboolTidak ada yang dideklarasikanMendukung pemeriksaan resume
PipelineContext::allStepResultstidak adaSemua hasil yang direkam sejauh iniarray<string, StepResult>Tidak ada yang dideklarasikanBerkunci berdasarkan ID langkah
PipelineContext::isResumetidak adaApakah run dilanjutkan dari sebuah langkahboolTidak ada yang dideklarasikan
PipelineResult::isSuccesstidak adaTrue hanya untuk status Completed keseluruhanboolTidak ada yang dideklarasikanHasil diproduksi oleh executor
PipelineResult::getStepResultstring $stepIdMenemukan satu hasil langkah berdasarkan ID?StepResultTidak ada yang dideklarasikannull untuk langkah yang dilewati atau tak dikenal
PipelineResult::failedStepstidak adaMemfilter hasil langkah yang gagallist<StepResult>Tidak ada yang dideklarasikanDaftar kosong pada keberhasilan penuh
StepResult::isSuccesstidak adaTrue hanya untuk status langkah CompletedboolTidak ada yang dideklarasikanMembawa stepId, type, status, durationMs, error, output
CapabilityResolverInterface::hasCapabilitystring $capabilityUji entitlement afirmatif untuk satu kode kapabilitasboolTidak boleh melemparDeny-by-omission: false untuk kode yang tak dikenal, kedaluwarsa, atau tak terpetakan
final class PipelineExecutor
{
public function __construct(
private readonly StepResolverRegistry $registry,
private readonly ?CapabilityResolverInterface $capabilityResolver = null,
)
public function execute(PipelineManifest $manifest, array $variables = []): PipelineResult
}
final class PipelineManifestBuilder
{
public static function create(string $manifestId): self
public function addStep(
string $id,
PipelineStepType $type,
array $parameters = [],
array $dependsOn = [],
?StepOutputType $outputType = null,
): self
public function stopOnError(bool $stop = true): self
public function maxRetries(int $retries): self
public function timeout(int $timeoutMs): self
public function resumeFrom(string $stepId): self
public function build(): PipelineManifest
}
interface CapabilityResolverInterface
{
public function hasCapability(string $capability): bool;
}

Validasi berjalan di konstruktor PipelineManifest, sebelum eksekusi apa pun. Secara berurutan: daftar langkah harus tidak kosong; jumlah langkah dibatasi pada 10 000, mengubah rantai dependensi yang dalam secara adversarial menjadi OverflowException yang dapat ditangkap alih-alih native stack exhaustion; ID langkah harus unik; setiap referensi dependsOn harus dapat diselesaikan; graf dependensi harus asiklik; tipe output harus kompatibel; langkah resume yang dideklarasikan harus ada. Setiap pelanggaran memunculkan InvalidArgumentException dengan pesan spesifik.

Pemeriksaan tipe output berlaku untuk langkah yang tipenya dipetakan ke output PDF: setiap dependensi dari langkah tersebut harus menghasilkan output PDF juga. Edge dependensi ke tipe langkah yang menghasilkan JSON (inspect, extract) tidak diperiksa tipenya pada rilis ini.

execute($manifest, $variables) membangun PipelineContext baru, menghitung urutan topologis, dan menjalankan langkah secara berurutan dalam urutan tersebut. Dengan titik resume yang ditetapkan, langkah-langkah sebelumnya dilewati sampai langkah bernama tercapai. Predesesor yang dilewati tidak dieksekusi ulang dan outputnya tidak dipulihkan: konteks bersifat per-run dan in-memory, sehingga langkah yang dilanjutkan yang membaca output predesesor yang dilewati akan mengamati null.

Timeout global, jika positif, dievaluasi di antara langkah, sebelum tiap langkah dimulai. Saat kedaluwarsa, status pipeline menjadi Failed dan langkah-langkah yang tersisa tidak dimulai. Langkah yang sudah berjalan tidak pernah diinterupsi di tengah eksekusi, sehingga satu langkah yang panjang dapat melampaui anggaran.

Setiap langkah menerima paling banyak maxRetries + 1 upaya. Upaya yang berhasil langsung mengembalikan hasil. Setiap upaya yang gagal — hasil Failed dari resolver, atau Throwable yang dilempar — diulang selama masih ada upaya tersisa; hasil dari upaya terakhir yang dikembalikan. Throwable yang dimunculkan di dalam resolver diturunkan menjadi hasil langkah Failed yang membawa pesan eksepsi, atau Unknown error ketika pesannya kosong. Oleh karena itu execute() selalu mengembalikan PipelineResult; ia tidak pernah merambatkan kegagalan resolver.

Tipe langkah tanpa resolver terdaftar menghasilkan hasil langkah Failed dengan pesan eksplisit; run tidak dibatalkan. Dengan stopOnError bernilai true (default), eksekusi berhenti pada langkah gagal pertama dan status pipeline menjadi Failed. Dengan nilai false, eksekusi berlanjut dan status akhir menjadi Failed jika ada langkah yang gagal, jika tidak Completed.

Sebelum dispatch resolver apa pun, setiap langkah yang digerbang pack (Redact, Extract, OcrOverlay) diperiksa terhadap CapabilityResolverInterface yang di-inject. Gerbang bersifat fail-closed: resolver yang hilang, jawaban false, atau kode kapabilitas yang tak terpetakan semuanya menolak langkah tersebut. Penolakan menghasilkan hasil langkah Failed yang error-nya membawa kode SPEC-LIC-001, tipe langkah, dan kapabilitas yang dibutuhkan. Penolakan tergerbang tidak mengonsumsi upaya retry dan melaporkan durasi 0.0. Implementasi resolver harus mengembalikan true hanya untuk entitlement yang dipegang secara afirmatif dan tidak boleh melempar.

PipelineResult melaporkan ID manifest, status keseluruhan, hasil per-langkah dalam urutan eksekusi, total durasi dalam milidetik, serta jumlah langkah total, selesai, dan gagal. stepsTotal menghitung setiap langkah dalam manifest, termasuk langkah yang dilewati oleh resume atau yang tak tercapai setelah halt; stepsCompleted dan stepsFailed hanya menghitung langkah yang dieksekusi.

  • Executor dirancang untuk eksekusi asinkron di dalam job worker. Penggunaan inline memblokir pemanggil selama keseluruhan durasi pipeline.
  • Timeout global adalah pemeriksaan antarlangkah. Satu langkah yang panjang dapat melampaui anggaran; tidak ada langkah yang diinterupsi di tengah jalan.
  • Resume hanya melewati langkah dalam eksekusi yang sama. Ia tidak memulihkan output dari store mana pun; resume lintas-run dengan output yang di-cache tidak diimplementasikan.
  • Mengonstruksi PipelineStep secara langsung menetapkan tipe output ke PDF secara default untuk setiap tipe langkah. Gunakan builder, atau berikan tipe output secara eksplisit, agar langkah inspect dan extract mendeklarasikan output JSON dan validasi edge tetap bermakna.
  • Eksepsi resolver dengan pesan kosong dinormalisasi menjadi Unknown error dalam hasil langkah.
  • Hasil langkah Failed yang diproduksi oleh gerbang atau oleh resolver yang hilang melaporkan durasi 0.0.
  • PipelineResult::getStepResult() mengembalikan null baik untuk ID tak dikenal maupun untuk langkah yang dilewati oleh resume atau halt; bedakan melalui stepsTotal versus panjang daftar hasil.
  • Modul ini tidak melakukan operasi kriptografis dan tidak mendefinisikan perilaku khusus FIPS. Postur FIPS untuk langkah sign diatur oleh modul penandatanganan, bukan oleh pipeline.

Pipeline tidak melakukan pekerjaan kesesuaian format sendiri. Kesesuaian setiap artefak yang dihasilkan dimiliki oleh modul di balik langkah yang mengeksekusi — penandatanganan, optimasi, konversi, dan seterusnya — dan didokumentasikan pada halaman referensi modul-modul tersebut. Halaman ini tidak mengklaim pengenal klausa eksternal apa pun; setiap pernyataan didasarkan pada source produk. NextPDF tidak membuat klaim sertifikasi.

  • Source modul membawa @since 2.2.0; referensi ini mendokumentasikan permukaan sebagaimana dikirimkan dalam nextpdf/pro 3.1.0.
  • Semua kelas bersifat final; tipe manifest, options, step, dan result adalah value object readonly. Konstruksi instance baru alih-alih memutasi.
  • StepResolverInterface dan StepResolverRegistry bersifat @internal. Step resolver hanya bawaan; custom step handler yang didefinisikan pengguna tidak didukung pada rilis ini.
  • CapabilityResolverInterface adalah seam entitlement publik. Implementasi harus deny-by-omission dan tidak boleh default-allow.
  • Executor PHP ini adalah jalur validasi-manifest dan eksekusi sekuensial; deployment produksi dapat melakukan dispatch melalui sidecar untuk orkestrasi paralel. Gerbang kapabilitas pada jalur PHP bersifat fail-closed secara independen dalam kedua kasus.
  • Detail mekanisme internal tetap berada di dokumentasi internal repositori source dan berada di luar cakupan manual ini.

Halaman ini hanya mendokumentasikan perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Jalur namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefix tiket berada di luar cakupan.