Перейти к содержимому
getnextpdf.com

Pro редакция

Output Pipeline — глубокий справочник

Эта страница — углублённый справочник по публичной поверхности NextPDF\Pro\OutputPipeline. Она охватывает построение и валидацию манифеста, топологический порядок выполнения, семантику повторов и тайм-аута, поведение возобновления и отказоустойчивый (fail-closed) гейт возможностей Pack. Для каждого публичного символа указаны параметры, значения по умолчанию и режимы отказа. Сначала прочитайте страницу возможности Output Pipeline для руководства по рабочим процессам.

Эта возможность поставляется в NextPDF Pro (nextpdf/pro) и активируется лицензионным конвертом уровня Pro. Развёртывание без этого права не загружает классы возможности. Сравните редакции и получите лицензию.

Исполнитель и семь из десяти типов шагов не имеют пофункционального флага. Три типа шагов дополнительно требуют возможности Pack:

Тип шагаЗначение в манифестеТребуемая возможностьPack
Redactredactpack.privacy.redactPrivacy Pack
Extractextractpack.intelligence.extractIntelligence Pack
OCR overlayocr_overlaypack.intelligence.searchable_pdfIntelligence Pack

Гейт применяется во время выполнения, отказоустойчиво (fail-closed), до того как шаг достигнет своего резолвера. Нелицензированный гейтированный шаг даёт проваленный результат шага с кодом SPEC-LIC-001 и требуемой возможностью; резолвер не вызывается. Конвейер без внедрённого резолвера возможностей отклоняет каждый гейтированный шаг.

Окно терминала
composer require nextpdf/pro:^3

Метапакет nextpdf/premium устанавливает код nextpdf/pro; этот модуль находится в пространстве имён NextPDF\Pro\OutputPipeline.

СимволПараметрыПоведение по умолчаниюВозвращаетБросает или завершается сПримечания
PipelineExecutor::__constructStepResolverRegistry $registry, ?CapabilityResolverInterface $capabilityResolver = nullСвязывает встроенный реестр резолверов и необязательный источник правPipelineExecutorНичего не объявленоНулевой резолвер возможностей отклоняет каждый шаг, гейтированный по Pack
PipelineExecutor::executePipelineManifest $manifest, array $variables = []Выполняет шаги в топологическом порядке и агрегирует результатыPipelineResultНичего не объявлено; сбои резолвера фиксируются как проваленные результаты шагаРассчитан на выполнение внутри асинхронного обработчика заданий
PipelineManifest::__constructstring $id, array $steps, PipelineOptions $options = new PipelineOptions(), ?string $resumeFromStepId = nullПроверяет граф шагов при созданииPipelineManifestInvalidArgumentException при пустом списке шагов, дублирующихся ID шагов, неизвестных зависимостях, циклах, несовпадении типов вывода или отсутствующем шаге возобновления; OverflowException при превышении 10 000 шаговВся валидация завершается до какого-либо выполнения
PipelineManifest::topologicalOrderнетУпорядочивает шаги так, что зависимости идут перед зависимымиlist<PipelineStep>Ничего не объявленоДетерминирован для данного манифеста
PipelineManifest::getStepstring $stepIdЛинейный поиск по ID шага?PipelineStepНичего не объявленоnull для неизвестного ID
PipelineManifest::rootStepsнетВозвращает шаги без зависимостейlist<PipelineStep>Ничего не объявленоКорневые шаги выполняются первыми
PipelineManifestBuilder::createstring $manifestIdНачинает новый построительselfНичего не объявленоКонструктор приватный; это единственная точка входа
PipelineManifestBuilder::addStepstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], ?StepOutputType $outputType = nullДобавляет шаг; нулевой тип вывода выводится из типа шагаselfНичего не объявленоВалидация откладывается до build()
PipelineManifestBuilder::stopOnErrorbool $stop = trueЗадаёт остановку при первом сбоеselfНичего не объявленоПо умолчанию true
PipelineManifestBuilder::maxRetriesint $retriesЗадаёт предел повторов на шагselfНичего не объявленоПо умолчанию 0 (без повторов)
PipelineManifestBuilder::timeoutint $timeoutMsЗадаёт глобальный тайм-аут конвейераselfНичего не объявлено0 отключает тайм-аут
PipelineManifestBuilder::resumeFromstring $stepIdЗадаёт точку возобновленияselfНичего не объявленоШаг должен существовать на момент build()
PipelineManifestBuilder::buildнетСоздаёт проверенный манифестPipelineManifestКак у PipelineManifest::__construct
PipelineOptions::__constructbool $stopOnError = true, int $maxRetries = 0, int $timeoutMs = 0Неизменяемые параметры выполненияPipelineOptionsНичего не объявленоReadonly объект-значение
PipelineStep::__constructstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], StepOutputType $outputType = StepOutputType::PdfНеизменяемое определение шагаPipelineStepНичего не объявленоПри прямом создании тип вывода по умолчанию — PDF для любого типа
PipelineStep::isRootнетTrue, когда у шага нет зависимостейboolНичего не объявлено
PipelineStepType (enum)Десять строковых вариантов: generate, merge, split, inspect, compress, sign, convert, плюс гейтированные redact, extract, ocr_overlayПо одному варианту на каждую встроенную операцию
PipelineStepType::requiresPackнетTrue для Redact, Extract и OcrOverlayboolНичего не объявленоВсе остальные варианты возвращают false
PipelineStepType::requiredCapabilityнетСопоставляет гейтированные варианты с их кодами возможностей?stringНичего не объявленоnull для негейтированных вариантов
PipelineStatus (enum)Пять вариантов: pending, running, completed, failed, cancelledОбщий для результатов конвейера и шага
PipelineStatus::isTerminalнетTrue для Completed, Failed и CancelledboolНичего не объявленоPending и Running — нетерминальные
StepOutputType (enum)Три варианта: pdf, json, metadataУправляет валидацией рёбер на этапе сборки
StepOutputType::forStepTypePipelineStepType $stepTypeТип вывода по умолчанию для типа шагаselfНичего не объявленоInspect и Extract сопоставляются с JSON; все остальные типы — с PDF
StepOutputType::isCompatibleWithself $expectedInputTrue при совпадении типов или для вывода PDFboolНичего не объявленоВспомогательный; PDF — универсальный вход
PipelineContext::__constructstring $manifestId, array $variables = [], ?string $resumeFromStepId = nullКонтекст в памяти на один запускPipelineContextНичего не объявленоНет TTL, срока действия, персистентности или хранилища
PipelineContext::setStepResult / ::getStepResultstring $stepId (+ StepResult при записи)Записывает или читает результат шагаvoid / ?StepResultНичего не объявленоnull для ещё не выполненного шага
PipelineContext::setStepOutput / ::getStepOutputstring $stepId (+ mixed при записи)Сохраняет или читает промежуточный выводvoid / mixedНичего не объявленоnull для отсутствующего вывода
PipelineContext::hasStepResultstring $stepIdВыполнялся ли уже шагboolНичего не объявленоПоддерживает проверки возобновления
PipelineContext::allStepResultsнетВсе зафиксированные к текущему моменту результатыarray<string, StepResult>Ничего не объявленоС ключом по ID шага
PipelineContext::isResumeнетВозобновляется ли запуск с шагаboolНичего не объявлено
PipelineResult::isSuccessнетTrue только для общего статуса CompletedboolНичего не объявленоРезультат создаётся исполнителем
PipelineResult::getStepResultstring $stepIdНаходит один результат шага по ID?StepResultНичего не объявленоnull для пропущенных или неизвестных шагов
PipelineResult::failedStepsнетОтбирает проваленные результаты шаговlist<StepResult>Ничего не объявленоПустой список при полном успехе
StepResult::isSuccessнетTrue только для статуса шага CompletedboolНичего не объявленоСодержит stepId, type, status, durationMs, error, output
CapabilityResolverInterface::hasCapabilitystring $capabilityПозитивная проверка права на один код возможностиboolНе должен бросатьЗапрет по умолчанию: false для неизвестных, истёкших или несопоставленных кодов
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;
}

Валидация выполняется в конструкторе PipelineManifest, до какого-либо выполнения. По порядку: список шагов должен быть непустым; количество шагов ограничено 10 000, что превращает состязательно глубокие цепочки зависимостей в перехватываемое OverflowException вместо исчерпания нативного стека; ID шагов должны быть уникальными; каждая ссылка dependsOn должна разрешаться; граф зависимостей должен быть ацикличным; типы вывода должны быть совместимы; объявленный шаг возобновления должен существовать. Каждое нарушение вызывает InvalidArgumentException с конкретным сообщением.

Проверка типа вывода применяется к шагам, тип которых сопоставляется с выводом PDF: каждая зависимость такого шага сама должна производить вывод PDF. Рёбра зависимостей к типам шагов, производящим JSON (inspect, extract), в этом релизе по типу не проверяются.

Порядок выполнения, возобновление и тайм-аут

Заголовок раздела «Порядок выполнения, возобновление и тайм-аут»

execute($manifest, $variables) создаёт новый PipelineContext, вычисляет топологический порядок и выполняет шаги последовательно в этом порядке. Если задана точка возобновления, предыдущие шаги пропускаются, пока не будет достигнут названный шаг. Пропущенные предшественники не выполняются повторно, а их выводы не восстанавливаются: контекст относится к одному запуску и хранится в памяти, поэтому возобновлённый шаг, читающий вывод пропущенного предшественника, получает null.

Глобальный тайм-аут, если он положителен, проверяется между шагами, перед стартом каждого шага. По истечении статус конвейера становится Failed, а оставшиеся шаги не запускаются. Уже выполняющийся шаг никогда не прерывается посреди исполнения, поэтому один длинный шаг может выйти за пределы бюджета.

Каждый шаг получает не более maxRetries + 1 попыток. Успешная попытка возвращается немедленно. Любая неудачная попытка — результат Failed от резолвера или брошенный Throwable — повторяется, пока остаются попытки; возвращается результат последней попытки. Throwable, брошенный внутри резолвера, понижается до проваленного результата шага с сообщением исключения или Unknown error, если сообщение пустое. Поэтому execute() всегда возвращает PipelineResult; он никогда не пробрасывает сбой резолвера.

Тип шага без зарегистрированного резолвера даёт проваленный результат шага с явным сообщением; запуск не прерывается. При stopOnError равном true (по умолчанию) выполнение останавливается на первом проваленном шаге, и статус конвейера — Failed. При false выполнение продолжается, а итоговый статус — Failed, если хоть один шаг провалился, иначе Completed.

Перед любой диспетчеризацией резолвера каждый гейтированный по Pack шаг (Redact, Extract, OcrOverlay) проверяется через внедрённый CapabilityResolverInterface. Гейт отказоустойчив (fail-closed): отсутствующий резолвер, ответ false или несопоставленный код возможности — всё это отклоняет шаг. Отклонение создаёт проваленный результат шага, ошибка которого содержит код SPEC-LIC-001, тип шага и требуемую возможность. Гейтированное отклонение не расходует попытки повтора и сообщает длительность 0.0. Реализации резолвера должны возвращать true только для позитивно имеющегося права и не должны бросать исключения.

PipelineResult сообщает ID манифеста, общий статус, результаты по каждому шагу в порядке выполнения, общую длительность в миллисекундах, а также общее число шагов, число завершённых и число проваленных. stepsTotal считает каждый шаг в манифесте, включая шаги, пропущенные при возобновлении или не достигнутые после остановки; stepsCompleted и stepsFailed считают только выполненные шаги.

  • Исполнитель рассчитан на асинхронное выполнение внутри обработчика заданий. Встраиваемое использование блокирует вызывающую сторону на всё время работы конвейера.
  • Глобальный тайм-аут — это проверка между шагами. Один длинный шаг может выйти за пределы бюджета; ни один шаг не прерывается на лету.
  • Возобновление пропускает шаги только в рамках одного выполнения. Оно не восстанавливает выводы из какого-либо хранилища; возобновление между запусками с кэшированными выводами не реализовано.
  • При прямом создании PipelineStep тип вывода по умолчанию — PDF для любого типа шага. Используйте построитель или передавайте тип вывода явно, чтобы шаги inspect и extract объявляли вывод JSON, а валидация рёбер оставалась осмысленной.
  • Исключение резолвера с пустым сообщением нормализуется в Unknown error в результате шага.
  • Проваленные результаты шага, созданные гейтом или отсутствующим резолвером, сообщают длительность 0.0.
  • PipelineResult::getStepResult() возвращает null как для неизвестных ID, так и для шагов, пропущенных при возобновлении или остановке; различайте по stepsTotal относительно длины списка результатов.
  • Этот модуль не выполняет криптографических операций и не определяет FIPS-специфичного поведения. Позиция FIPS для шага sign определяется модулем подписания, а не конвейером.

Конвейер не выполняет собственной работы по соответствию форматам. Соответствие каждого созданного артефакта принадлежит модулю, стоящему за выполняющим шагом — подписание, оптимизация, конвертация и так далее — и документируется на справочных страницах этих модулей. Эта страница не утверждает внешних идентификаторов пунктов; каждое утверждение основано на исходном коде продукта. NextPDF не делает заявлений о сертификации.

  • Исходный код модуля содержит @since 2.2.0; этот справочник документирует поверхность в том виде, в каком она поставляется в nextpdf/pro 3.1.0.
  • Все классы final; типы манифеста, параметров, шага и результата — readonly объекты-значения. Создавайте новые экземпляры вместо изменения.
  • StepResolverInterface и StepResolverRegistry помечены @internal. Резолверы шагов только встроенные; пользовательские кастомные обработчики шагов в этом релизе не поддерживаются.
  • CapabilityResolverInterface — публичный шов для прав. Реализации должны действовать по принципу запрета по умолчанию и не должны разрешать по умолчанию.
  • Этот PHP-исполнитель — путь валидации манифеста и последовательного выполнения; продакшн-развёртывания могут диспетчеризовать через sidecar для параллельной оркестрации. Гейт возможностей на пути PHP в любом случае независимо отказоустойчив (fail-closed).
  • Детали внутреннего механизма остаются во внутренней документации репозитория исходного кода и находятся за рамками этого руководства.

Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую поверхность публичного API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов — за рамками.