Repository navigation
Qualify optional Octane HTTP acceleration and Laravel worker cache configuration #112
Description
Outcome
Offer an optional, qualified Octane HTTP profile for Laravel applications using the PHP service SDK. Keep ordinary PHP hosting and the independent durable-workflow:worker CLI process supported. Let Laravel users configure the worker's existing history cache without constructing a custom worker.
Verified starting point
Published PHP SDK 2.2.6 has a persistent worker loop and StickyWorkflowCache, defaulting to 100 entries and a 300-second TTL, with a 3600-second TTL ceiling. Worker accepts cache settings and exposes hit/miss/eviction/forced-cold-replay counters. WorkerFactory, Worker::create() and the Laravel configuration do not expose those settings. Replayer constructs a fresh Fiber, so a history-cache hit still replays workflow instructions.
The Laravel provider retains process clients/configuration, a deferred client closure capturing a container, and a singleton worker factory. These need repeated-request qualification. This source review establishes review points, not a confirmed Octane leak or a measured speedup.
Octane v2.21.0 permits Laravel 10.10.1 through 13. Laravel 9 support in our bridge does not establish Octane support. Start with one exact modern PHP/Laravel/Octane/backend tuple and expand only when tested.
Work and acceptance
- Install Octane in an isolated customer-style Laravel fixture as an optional application dependency. Use standard
octane:install,octane:start, reload and worker recycling configuration. Do not add Octane or a server extension to the core SDK requirements. Publish a runnable recipe naming the qualified backend and tuple. - Keep workflow/activity polling in the separately supervised CLI worker. Document HTTP and execution worker counts independently. No HTTP request, Octane task or tick may become the durable worker or timer scheduler.
- Qualify eager boot-time and lazy SDK resolution across repeated requests, alternating synthetic identities, authorized namespaces, request headers and log context. Reuse a process client only within a fixed endpoint/namespace/credential authority. Fix demonstrated stale container/request/configuration captures. Request-specific state and credentials must not mutate a shared client or leak into another request.
- Expose validated Laravel worker history-cache capacity and TTL, initially preserving 100/300 defaults and the existing TTL ceiling. A proposed shape is
durable-workflow.worker.sticky_cache.{capacity,ttl_seconds}. Explain that these control retained history, not live execution. Reuse existing diagnostics, record retained memory, and define a conservative memory budget before recommending larger capacities. Keep configuration-cache artifacts free of credentials. - Test cache expiry/eviction, HTTP recycling/reload, CLI replacement/SIGKILL and lost runtime connections. Require authoritative cold replay, unchanged results/commands/deadlines and no duplicate recorded activity effects. Exercise cancellation, signals and queries. Coordinate handler lifetime with Isolate class-oriented workflow state across executions and replay #16 and Release PHP 3 with fresh attributed workflow instances #111 rather than duplicating that fix or treating the draft as published.
- Compare ordinary production PHP request handling and Octane with equivalent OPcache/config caching, fixed runtime and unchanged CLI workers. Measure submission and status/result reads separately from execution/replay. Record offered/completed/error/unfinished requests, p50/p95/p99, CPU per completed operation, aggregate steady/peak RSS, history bytes/requests and cache counters. Use at least three measured repetitions and recheck the baseline.
- Include a 1 GiB aggregate application/HTTP/worker budget, explicitly report any separately provisioned runtime/database resources, and reject swapping, OOM, growing backlog or an unmeasured drain as gains. Verify timer due-to-resume latency separately. Include repeated recycling and a bounded mixed-request soak for lifecycle/memory changes.
- Run relevant SDK/framework checks and verify the published SDK plus recipe. Publish exact configuration, reproducible qualification commands, concise results and resource tradeoffs. If HTTP bootstrap is not material, report that result without calling it a workflow execution speedup.
Live Fiber retention and result caching are separate work. This issue does not reopen Server runtime architecture or select a Cloud configuration.
Embedded HTTP qualification is Workflow #747. Retained service execution is #113, paired with Workflow #748. Qualify HTTP hosting here before publishing an Octane recommendation, and keep replay savings attributed to those separate worker experiments.
Activity
rmcdaniel commentedon Oct 13, 2026
Source recovery confirms the existing worker history cache still defaults to 100 entries and 300 seconds, with a 3600-second TTL ceiling.
Worker::create(), LaravelWorkerFactoryand published Laravel configuration do not expose those controls. A cache hit still runs a fresh replay.The first implementation slice after the current release handoff will expose validated
worker.sticky_cache.{capacity,ttl_seconds}through that existing path, preserving defaults, ordinary hosting, DI and credential-free configuration-cache artifacts. Qualification will check actual capacity/expiry behavior and authoritative cold fallback, alongside the existing cache/replay controls. The held #16/#111 lifetime decision remains separate.The initial HTTP comparison proposal is PHP 8.3 / Laravel 12 / optional Octane 2.21.0 with RoadRunner against nginx + PHP-FPM, subject to verification of exact installed dependencies and images. Octane's versioned requirements permit Laravel 12; the official lifecycle guidance identifies the retained-container/request review points. Workflow #747's owner has acknowledged this common starting profile; exact workloads and the final artifact tuple will be agreed before timing.
Keep the same separately supervised
durable-workflow:workerCLI process and unchanged runtime throughout. The proposed customer allocation is 2 total CPUs / 1 GiB across HTTP/application and CLI worker, with backend resources separately disclosed. Measure submission, status/result reads and timer continuation separately; use three repetitions, an ordinary baseline recheck and a bounded recycling/reload/memory soak. Preserve unfinished/error work in the denominator and reject OOM, swapping, growing backlog or unmeasured drain as gains.No Octane execution, isolation result or speedup is claimed yet. #113's live-retention decision follows actual replay-cost profiling.
rmcdaniel commentedon Oct 13, 2026
The existing history-cache configuration slice is implemented in draft PR #154, exact head
ce6621229f9280d280d6046c378bb1ad4df769d6.Worker::create()and Laravel/Symfony factories accept validated capacity/TTL; defaults remain 100/300 and TTL remains capped at 3600 seconds. Invalid shapes/types and out-of-range bounds fail before polling.71 focused tests / 524 assertions pass, including configured factory expiry/eviction, identical cold-replay commands and authoritative history fallback. Laravel 12.69.3 / Symfony 7.4.20 behavioral fixtures and real Laravel
config:cachepreserve custom bounds without credentials. Source/framework PHPStan, Composer validation and dependency boundary pass. Hosted candidate gates remain pending. Local test dependencies and caches are retired.This source slice is not a published cache-control or Octane qualification claim. The isolated HTTP profile, eager/lazy resolution and identity/lifecycle checks, fixed aggregate 1 GiB comparison, three repetitions, baseline drift and bounded soak remain on this issue. Workflow #747's owner has acknowledged the proposed common profile; freeze the final installed tuple and workload before measurement. #113's live-retention decision still follows replay-cost profiling.
rmcdaniel commentedon Oct 13, 2026
The cache configuration slice is incorporated in stable PR #156, merged at
5ba854117a2355ec862235034c0f84e78ce5199bwith the identical reviewed tree. Fresh merged CI, publication and normal installed qualification remain pending; this is not yet a published 2.3.8 receipt.For the separate optional Octane work, the Workflow #747 owner and PHP SDK owner agree on PHP 8.3, Laravel 12.69.3 and Octane 2.21.0, comparing nginx/FPM with RoadRunner. RoadRunner 2025.1.15 is the initial pinned target, subject to compatibility in the actual installation; an automatic latest download or RoadRunner 3 compatibility claim is not part of this plan.
The comparison uses two total CPUs and 1 GiB for application, HTTP and the separately supervised CLI worker, with backend resources disclosed separately. Service mode keeps
durable-workflow:worker; the embedded profile uses ordinary Laravel queue workers. Shared workload families cover authenticated start/status/result, a short activity, durable timer, signal/query, selected cancellation, namespace/request/log alternation, eager/lazy resolution, reload/recycling and independent CLI replacement.The concrete workload manifest is still pending. Exact locks, images and offered schedules must be frozen before three measured repetitions, a baseline recheck, measured drain and bounded soak. No Octane timing, lifecycle qualification or performance benefit is claimed. Finish the existing release obligations before starting that runtime qualification. This issue remains open for that work.
rmcdaniel commentedon Oct 13, 2026
The cache configuration slice is shipped and normally installed qualified in PHP 2.3.8, exact source/dist
5ba854117a2355ec862235034c0f84e78ce5199b. Installed receipt, completed main/portal alignment. Installed eviction/expiry/cold replay and Laravel/Symfony recipes pass; the live portal exposes the settings with defaults 100/300 and TTL ceiling 3600. #154 is incorporated and closed.This issue remains open for the separate optional Octane profile. Next: freeze the actual compatible installation and exact runtime/lock identities against the agreed PHP 8.3 / Laravel 12.69.3 / Octane 2.21.0 / RoadRunner 2025.1.15 starting target, then agree the concrete workload manifest before any timing. Lifecycle/isolation controls and fixed aggregate resource accounting precede the three repetitions, baseline recheck, measured drain and soak. No Octane performance or lifecycle qualification is claimed yet.
rmcdaniel commentedon Oct 14, 2026
I am advancing the remaining optional HTTP profile against the normally published PHP SDK 2.4.0, Laravel 12.69.3, PHP 8.3.35, Octane 2.21.0 and RoadRunner 2025.1.15. The existing cache controls remain unchanged.
The application candidate uses the standard Laravel bridge with a fixed runtime endpoint/namespace/credential authority. It alternates synthetic users, rejects another namespace before SDK access, clears request log context, and supports eager or lazy HTTP resolution. Only the HTTP process receives the client-role token. The independently supervised
durable-workflow:workerprocess receives the worker-role token. Preparation receives neither. Start/status, one activity, timer, signal/query and cancellation routes are prepared.Next: resolve the normal package lock and verify installation/configuration, then admit an isolated published-runtime lifecycle cohort. The two-CPU/1-GiB application allocation is fixed in Compose; runtime/database costs are separate. No new runtime admission, Octane lifecycle acceptance or performance benefit is claimed yet. Three paired measurements, baseline recheck and bounded soak remain after correctness gates. The embedded #747 measurement does not qualify this service profile.
rmcdaniel commentedon Oct 14, 2026
The cache qualification attempt stopped because the actual worker listing lacked cache counters. Missing telemetry remains unavailable, not zero; that original remains unqualified.
I will expose the Worker’s existing lifetime
hit,miss,evictionandforced_cold_replaycounters in the existingworker.stoppeddiagnostic context understicky_cache. PSR logging, the diagnostic callback and both framework event dispatchers already forward that context. Cache clearing removes retained history but preserves these counters.Acceptance: a managed worker processes real test deliveries, falls back to authoritative history after eviction, then reports its nonzero final counters through both logging and diagnostics after cleanup. Laravel and Symfony compatibility checks must receive the same counters through their existing event path. This changes diagnostic reporting only; cache defaults, history replay, protocol requests and authority remain unchanged.
Source and hosted checks come first, followed by a compatible published patch and normal installed framework verification. PR #169’s optional application and all original failures stay separate. Cache expiry/eviction/connection-loss qualification and measured HTTP comparisons still remain on #112.
rmcdaniel commentedon Oct 16, 2026
The interim hosting report is now committed on draft #169. Its current documentation checks and Sonar review pass; it is not final hosting or performance acceptance.
The earlier two-worker paired runs completed, but the final pair showed only a 0.35% application CPU difference. The mixed-load runs failed. The later four-worker FPM recipe handled both actual reloads without HTTP errors, then exposed backlog under one backend allocation and a real MySQL command deadlock under the larger allocation. Increasing backend CPU alone did not qualify the recipe. No four-worker Octane mixed-load pass or general performance gain is claimed.
Workflow #819 now has a published, normally installed 2.5.28 correction with a real deadlock counterfactual. Sample #233 delivers that package in both architecture images. The selected Server 2.8.6 still contains Workflow 2.5.22, so the affected Server dependency/image consumer remains required before fresh FPM/Octane mixed runs, repeated pairs and drift qualification. Those new results will remain separate from the unsuccessful originals.
The existing README's Laravel service-mode link is independently fixed and deployed through #177. No local experiment resources or paid task host remain.
rmcdaniel commentedon Oct 17, 2026
Current follow-through is in draft SDK #169 and its report at
79b0a6f. Earlierf6ac71asource passes all 32 applicable normal CI jobs and the actual k6 drain regression. New-head normal CI is pending. Its exact Sonar/app and public boundary pass; direct API review confirms 0.0% new duplication and zero OPEN/CONFIRMED findings.The fresh published FPM mixed original remains failed: 265/300 admissions, 92 dropped offers and 82 repairs. Both real HTTP reloads pass. Workflow #819's specific deadlock correction is delivered with 51 actual cancellation and 51 signal HTTP 204 responses, independently of this load failure.
The bounded diagnostic now passes two fresh eight-original normal SDK batches with exact typed results/deadlines and zero repairs or retries. Its trace finds one worker occupied by sequential HTTP operations and the query waiting for its own workflow resume. Existing cross-kind wake works in the captured original. A separate two-worker batch supports testing independent concurrency next, without establishing performance, capacity or a cause for the earlier repairs. All diagnostic runtime, data, images, dependencies, raw samples and temporary credentials are retired.
Next: exercise the prospective two-worker Compose override with the actual Laravel lifecycle, cache, recovery and shutdown controls, then use an isolated host for fresh strict load. The application allocation stays at 2 CPUs / 1 GiB. Both mixed gates, three alternating pairs, FPM drift and final source/main/report/onboarding acceptance remain open. All eight acceptance criteria stay unchecked.
rmcdaniel commentedon Oct 18, 2026
The fresh two-process FPM mixed cohort passes on 530c98b:300/300 originals,1800/1800 context requests,zero errors/drops/repairs/retries/pending work,independent typed/history/deadline audit and both actual reloads. All eleven roles retire cleanly. Earlier failed originals remain failed. Full receipt is on #169; remaining pool cache/recovery,Octane,pairs/drift and final onboarding remain open. Normal32 applicable source jobs and exact Sonar pass; no performance or final acceptance claim.
rmcdaniel commentedon Oct 18, 2026
The runnable hosting recipe and final report are merged through #169 at
d3f9dd7373876148b8a356241c4af93434ba31a6, whole tree70dea88627833b67c7c6978f9880c8cd111333a7, identical to the qualified candidate. All 36 applicable candidate checks pass; the opt-in connected-cancellation job is skipped. Sonar passes with zero OPEN/CONFIRMED PR issues and no ignored gate conditions.The measured results support starting with FPM. Both profiles pass functional/recovery controls, common-driver reload soaks and three comparison pairs plus drift. No consistent CPU/workflow speedup or history-cache saving is demonstrated; Octane's additional memory is disclosed. Earlier failed originals remain linked and failed.
Fresh-main CI 39088255960 and portal 39088255969 are pending. Final acceptance is those exact main checks plus the served Laravel onboarding link. This issue stays open until that readback completes. No SDK release is needed. Experiment host, access key, databases/raw samples and local task inputs are already deleted.
rmcdaniel commentedon Oct 18, 2026
Delivered through #169 at
d3f9dd7373876148b8a356241c4af93434ba31a6, whole70dea88627833b67c7c6978f9880c8cd111333a7, identical to the qualified candidate.All acceptance is complete for the documented profile. No core SDK release is needed. The experiment host/key, local access/data, raw databases/samples and completed source worktree/branch are retired; merged remote head is independently verified 404.