Salta ai contenuti
getnextpdf.com

Pro edizione

Output Pipeline — Riferimento approfondito

Questa pagina è il riferimento approfondito per la superficie pubblica di NextPDF\Pro\OutputPipeline. Copre la costruzione e la validazione del manifest, l’ordine di esecuzione topologico, la semantica di retry e timeout, il comportamento di resume e il gate fail-closed delle capability dei Pack. Indica parametri, valori predefiniti e modalità di errore per ogni simbolo pubblico. Per indicazioni sul workflow, leggere prima la pagina della funzionalità Output Pipeline.

Questa funzionalità è inclusa in NextPDF Pro (nextpdf/pro) e si attiva con un envelope di licenza di livello Pro. Un deployment privo di tale entitlement non carica le classi della funzionalità. Confronta le edizioni e ottieni una licenza.

L’executor e sette dei dieci tipi di step non prevedono alcun flag per funzionalità. Tre tipi di step richiedono inoltre una capability di un Pack:

Tipo di stepValore nel manifestCapability richiestaPack
Redazioneredactpack.privacy.redactPrivacy Pack
Estrazioneextractpack.intelligence.extractIntelligence Pack
Overlay OCRocr_overlaypack.intelligence.searchable_pdfIntelligence Pack

Il gate viene applicato in fase di esecuzione, fail-closed, prima che lo step raggiunga il proprio resolver. Uno step gated privo di licenza produce un risultato di step Failed che riporta il codice SPEC-LIC-001 e la capability richiesta; il resolver non viene mai invocato. Una pipeline senza un capability resolver iniettato rifiuta ogni step gated.

Terminal window
composer require nextpdf/pro:^3

Il metapackage nextpdf/premium installa il codice di nextpdf/pro; questo modulo risiede nel namespace NextPDF\Pro\OutputPipeline.

SimboloParametriComportamento predefinitoRestituisceSolleva o fallisce conNote
PipelineExecutor::__constructStepResolverRegistry $registry, ?CapabilityResolverInterface $capabilityResolver = nullCollega il registro dei resolver integrati e la sorgente di entitlement opzionalePipelineExecutorNulla dichiaratoUn capability resolver null rifiuta ogni step gated dei Pack
PipelineExecutor::executePipelineManifest $manifest, array $variables = []Esegue gli step in ordine topologico e aggrega i risultatiPipelineResultNulla dichiarato; i fallimenti dei resolver vengono catturati come risultati di step FailedProgettato per essere eseguito all’interno di un job worker asincrono
PipelineManifest::__constructstring $id, array $steps, PipelineOptions $options = new PipelineOptions(), ?string $resumeFromStepId = nullValida il grafo degli step in fase di costruzionePipelineManifestInvalidArgumentException per lista di step vuota, ID di step duplicati, dipendenze sconosciute, cicli, mismatch del tipo di output o step di resume mancante; OverflowException oltre 10 000 stepTutta la validazione si completa prima di qualsiasi esecuzione
PipelineManifest::topologicalOrdernessunoOrdina gli step con le dipendenze prima dei dipendentilist<PipelineStep>Nulla dichiaratoDeterministico per un dato manifest
PipelineManifest::getStepstring $stepIdRicerca lineare per ID di step?PipelineStepNulla dichiaratonull per un ID sconosciuto
PipelineManifest::rootStepsnessunoRestituisce gli step privi di dipendenzelist<PipelineStep>Nulla dichiaratoGli step root vengono eseguiti per primi
PipelineManifestBuilder::createstring $manifestIdAvvia un nuovo builderselfNulla dichiaratoIl costruttore è privato; questo è l’unico punto di ingresso
PipelineManifestBuilder::addStepstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], ?StepOutputType $outputType = nullAggiunge uno step; un tipo di output null viene dedotto dal tipo di stepselfNulla dichiaratoLa validazione è rinviata a build()
PipelineManifestBuilder::stopOnErrorbool $stop = trueImposta l’arresto al primo fallimentoselfNulla dichiaratoValore predefinito true
PipelineManifestBuilder::maxRetriesint $retriesImposta il limite massimo di retry per stepselfNulla dichiaratoValore predefinito 0 (nessun retry)
PipelineManifestBuilder::timeoutint $timeoutMsImposta il timeout globale della pipelineselfNulla dichiarato0 disabilita il timeout
PipelineManifestBuilder::resumeFromstring $stepIdImposta il punto di resumeselfNulla dichiaratoLo step deve esistere al momento di build()
PipelineManifestBuilder::buildnessunoCostruisce il manifest validatoPipelineManifestCome PipelineManifest::__construct
PipelineOptions::__constructbool $stopOnError = true, int $maxRetries = 0, int $timeoutMs = 0Opzioni di esecuzione immutabiliPipelineOptionsNulla dichiaratoValue object readonly
PipelineStep::__constructstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], StepOutputType $outputType = StepOutputType::PdfDefinizione di step immutabilePipelineStepNulla dichiaratoLa costruzione diretta imposta come predefinito il tipo di output PDF per ogni tipo
PipelineStep::isRootnessunoTrue quando lo step non ha dipendenzeboolNulla dichiarato
PipelineStepType (enum)Dieci case string-backed: generate, merge, split, inspect, compress, sign, convert, più i gated redact, extract, ocr_overlayUn case per ciascuna operazione integrata
PipelineStepType::requiresPacknessunoTrue per Redact, Extract e OcrOverlayboolNulla dichiaratoTutti gli altri case restituiscono false
PipelineStepType::requiredCapabilitynessunoMappa i case gated ai rispettivi codici di capability?stringNulla dichiaratonull per i case non gated
PipelineStatus (enum)Cinque case: pending, running, completed, failed, cancelledCondiviso dai risultati di pipeline e di step
PipelineStatus::isTerminalnessunoTrue per Completed, Failed e CancelledboolNulla dichiaratoPending e Running non sono terminali
StepOutputType (enum)Tre case: pdf, json, metadataGuida la validazione degli edge in fase di build
StepOutputType::forStepTypePipelineStepType $stepTypeTipo di output predefinito per un tipo di stepselfNulla dichiaratoInspect ed Extract mappano su JSON; tutti gli altri tipi mappano su PDF
StepOutputType::isCompatibleWithself $expectedInputTrue per una corrispondenza dello stesso tipo o per un output PDFboolNulla dichiaratoHelper; PDF è l’input universale
PipelineContext::__constructstring $manifestId, array $variables = [], ?string $resumeFromStepId = nullContesto in-memory per singola esecuzionePipelineContextNulla dichiaratoNessun TTL, scadenza, persistenza o backing store
PipelineContext::setStepResult / ::getStepResultstring $stepId (+ StepResult in set)Registra o legge un risultato di stepvoid / ?StepResultNulla dichiaratonull per uno step non ancora eseguito
PipelineContext::setStepOutput / ::getStepOutputstring $stepId (+ mixed in set)Memorizza o legge un output intermediovoid / mixedNulla dichiaratonull per un output mancante
PipelineContext::hasStepResultstring $stepIdIndica se uno step è già stato eseguitoboolNulla dichiaratoSupporta le verifiche di resume
PipelineContext::allStepResultsnessunoTutti i risultati registrati finoraarray<string, StepResult>Nulla dichiaratoIndicizzato per ID di step
PipelineContext::isResumenessunoIndica se l’esecuzione riprende da uno stepboolNulla dichiarato
PipelineResult::isSuccessnessunoTrue solo per lo stato complessivo CompletedboolNulla dichiaratoIl risultato è prodotto dall’executor
PipelineResult::getStepResultstring $stepIdTrova un risultato di step per ID?StepResultNulla dichiaratonull per step saltati o sconosciuti
PipelineResult::failedStepsnessunoFiltra i risultati di step fallitilist<StepResult>Nulla dichiaratoLista vuota in caso di successo completo
StepResult::isSuccessnessunoTrue solo per lo stato di step CompletedboolNulla dichiaratoRiporta stepId, type, status, durationMs, error, output
CapabilityResolverInterface::hasCapabilitystring $capabilityTest affermativo di entitlement per un singolo codice di capabilityboolNon deve sollevare eccezioniDeny-by-omission: false per codici sconosciuti, scaduti o non mappati
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;
}

La validazione avviene nel costruttore di PipelineManifest, prima di qualsiasi esecuzione. Nell’ordine: la lista degli step deve essere non vuota; il numero di step è limitato a 10 000, convertendo catene di dipendenze deliberatamente profonde in un OverflowException catturabile anziché in un esaurimento nativo dello stack; gli ID degli step devono essere univoci; ogni riferimento dependsOn deve risolversi; il grafo delle dipendenze deve essere aciclico; i tipi di output devono essere compatibili; uno step di resume dichiarato deve esistere. Ogni violazione solleva InvalidArgumentException con un messaggio specifico.

Il controllo del tipo di output si applica agli step il cui tipo mappa su output PDF: ogni dipendenza di uno step di questo tipo deve a sua volta produrre output PDF. Gli edge di dipendenza verso tipi di step che producono JSON (inspect, extract) non sono sottoposti a controllo di tipo in questa release.

execute($manifest, $variables) costruisce un nuovo PipelineContext, calcola l’ordinamento topologico ed esegue gli step sequenzialmente in quell’ordine. Con un punto di resume impostato, gli step precedenti vengono saltati finché non si raggiunge lo step indicato. I predecessori saltati non vengono rieseguiti e i loro output non vengono ripristinati: il contesto è per singola esecuzione e in-memory, quindi uno step ripreso che legge l’output di un predecessore saltato osserva null.

Il timeout globale, quando positivo, viene valutato tra uno step e l’altro, prima dell’avvio di ciascuno step. Alla scadenza lo stato della pipeline diventa Failed e gli step rimanenti non vengono avviati. Uno step già in esecuzione non viene mai interrotto a metà esecuzione, quindi un singolo step lungo può superare il budget.

Ogni step riceve al massimo maxRetries + 1 tentativi. Un tentativo riuscito ritorna immediatamente. Qualsiasi tentativo fallito — un risultato Failed dal resolver o un Throwable sollevato — viene ritentato finché restano tentativi; viene restituito il risultato dell’ultimo tentativo. Un Throwable sollevato all’interno di un resolver viene degradato a un risultato di step Failed che riporta il messaggio dell’eccezione, oppure Unknown error quando il messaggio è vuoto. execute() restituisce pertanto sempre un PipelineResult; non propaga mai un fallimento del resolver.

Un tipo di step privo di un resolver registrato produce un risultato di step Failed con un messaggio esplicito; l’esecuzione non viene interrotta. Con stopOnError a true (il valore predefinito), l’esecuzione si arresta al primo step fallito e lo stato della pipeline è Failed. Con il valore false, l’esecuzione prosegue e lo stato finale è Failed se un qualsiasi step è fallito, altrimenti Completed.

Prima di qualsiasi dispatch al resolver, ogni step gated dei Pack (Redact, Extract, OcrOverlay) viene verificato rispetto al CapabilityResolverInterface iniettato. Il gate è fail-closed: un resolver mancante, una risposta false o un codice di capability non mappato rifiutano tutti lo step. Il rifiuto produce un risultato di step Failed il cui errore riporta il codice SPEC-LIC-001, il tipo di step e la capability richiesta. Un rifiuto gated non consuma alcun tentativo di retry e riporta una durata di 0.0. Le implementazioni del resolver devono restituire true solo per un entitlement effettivamente posseduto e non devono sollevare eccezioni.

PipelineResult riporta l’ID del manifest, lo stato complessivo, i risultati per ciascuno step in ordine di esecuzione, la durata totale in millisecondi e il numero totale, completato e fallito degli step. stepsTotal conta ogni step del manifest, inclusi gli step saltati dal resume o non raggiunti dopo un arresto; stepsCompleted e stepsFailed contano solo gli step eseguiti.

  • L’executor è progettato per l’esecuzione asincrona all’interno di un job worker. L’uso inline blocca il chiamante per l’intera durata della pipeline.
  • Il timeout globale è una verifica tra uno step e l’altro. Un singolo step lungo può superare il budget; nessuno step viene interrotto a metà esecuzione.
  • Il resume salta gli step solo all’interno della stessa esecuzione. Non ripristina output da alcun archivio; il resume cross-run con output in cache non è implementato.
  • Costruire PipelineStep direttamente imposta come predefinito il tipo di output PDF per ogni tipo di step. Usare il builder, oppure passare esplicitamente il tipo di output, affinché gli step inspect ed extract dichiarino output JSON e la validazione degli edge resti significativa.
  • Un’eccezione di resolver con messaggio vuoto viene normalizzata in Unknown error nel risultato dello step.
  • I risultati di step Failed prodotti dal gate o da un resolver mancante riportano una durata di 0.0.
  • PipelineResult::getStepResult() restituisce null sia per ID sconosciuti sia per step saltati dal resume o da un arresto; distinguere tramite stepsTotal rispetto alla lunghezza della lista dei risultati.
  • Questo modulo non esegue alcuna operazione crittografica e non definisce alcun comportamento specifico per FIPS. La postura FIPS per lo step sign è governata dal modulo di firma, non dalla pipeline.

La pipeline non svolge alcun lavoro di conformità di formato in proprio. La conformità di ciascun artefatto prodotto è di competenza del modulo dietro lo step in esecuzione — firma, ottimizzazione, conversione e così via — ed è documentata nelle pagine di riferimento di tali moduli. Questa pagina non asserisce alcun identificatore di clausola esterno; ogni affermazione è fondata sul codice sorgente del prodotto. NextPDF non avanza alcuna rivendicazione di certificazione.

  • Il codice sorgente del modulo riporta @since 2.2.0; questo riferimento documenta la superficie come rilasciata in nextpdf/pro 3.1.0.
  • Tutte le classi sono final; i tipi manifest, options, step e result sono value object readonly. Costruire nuove istanze anziché mutarle.
  • StepResolverInterface e StepResolverRegistry sono @internal. I resolver di step sono esclusivamente integrati; gli handler di step personalizzati definiti dall’utente non sono supportati in questa release.
  • CapabilityResolverInterface è il punto di estensione pubblico per l’entitlement. Le implementazioni devono essere deny-by-omission e non devono consentire per impostazione predefinita.
  • Questo executor PHP è il percorso di validazione del manifest e di esecuzione sequenziale; i deployment di produzione possono effettuare il dispatch tramite il sidecar per l’orchestrazione parallela. Il gate delle capability sul percorso PHP è comunque fail-closed in modo indipendente.
  • I dettagli del meccanismo interno restano nella documentazione interna del repository sorgente e sono fuori ambito per questo manuale.

Questa pagina documenta esclusivamente il comportamento osservabile dall’esterno e la superficie API pubblica supportata. I percorsi di namespace interni, le classi helper, le tabelle dei meccanismi, i nomi dei file di runbook e i prefissi dei ticket sono fuori ambito.