Skip to content

Qualify optional Octane HTTP acceleration and Laravel worker cache configuration #112

Closed

Description

@rmcdaniel

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.

Sources

Activity

  1. added
    kind:featureA public product capability or experience is requested
    priority:P2Normal-priority product work
    completion:evidence-requiredClose only after all explicit acceptance and operational evidence is public
    intake:approvedCurrent issue title and body revision is approved for authority intake
    on Oct 11, 2026
  2. rmcdaniel commented on Oct 13, 2026

    @rmcdaniel
    MemberAuthor

    Source recovery confirms the existing worker history cache still defaults to 100 entries and 300 seconds, with a 3600-second TTL ceiling. Worker::create(), Laravel WorkerFactory and 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:worker CLI 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.

  3. rmcdaniel commented on Oct 13, 2026

    @rmcdaniel
    MemberAuthor

    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:cache preserve 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.

  4. rmcdaniel commented on Oct 13, 2026

    @rmcdaniel
    MemberAuthor

    The cache configuration slice is incorporated in stable PR #156, merged at 5ba854117a2355ec862235034c0f84e78ce5199b with 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.

  5. rmcdaniel commented on Oct 13, 2026

    @rmcdaniel
    MemberAuthor

    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.

  6. rmcdaniel commented on Oct 14, 2026

    @rmcdaniel
    MemberAuthor

    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:worker process 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.

  7. rmcdaniel commented on Oct 14, 2026

    @rmcdaniel
    MemberAuthor

    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, eviction and forced_cold_replay counters in the existing worker.stopped diagnostic context under sticky_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.

  8. rmcdaniel commented on Oct 16, 2026

    @rmcdaniel
    MemberAuthor

    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.

  9. rmcdaniel commented on Oct 17, 2026

    @rmcdaniel
    MemberAuthor

    Current follow-through is in draft SDK #169 and its report at 79b0a6f. Earlier f6ac71a source 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.

  10. rmcdaniel commented on Oct 18, 2026

    @rmcdaniel
    MemberAuthor

    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.

  11. rmcdaniel commented on Oct 18, 2026

    @rmcdaniel
    MemberAuthor

    The runnable hosting recipe and final report are merged through #169 at d3f9dd7373876148b8a356241c4af93434ba31a6, whole tree 70dea88627833b67c7c6978f9880c8cd111333a7, 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.

  12. rmcdaniel commented on Oct 18, 2026

    @rmcdaniel
    MemberAuthor

    Delivered through #169 at d3f9dd7373876148b8a356241c4af93434ba31a6, whole 70dea88627833b67c7c6978f9880c8cd111333a7, identical to the qualified candidate.

    • Fresh-main CI, Sonar, boundary and portal deployment pass. All 37 applicable main checks succeed; the opt-in connected-cancellation job is skipped. Candidate Sonar has zero OPEN/CONFIRMED findings and no ignored gate conditions.
    • The live Laravel guide serves the exact merged revision and links the runnable recipe. Its report and recipe were independently fetched and match qualified source bytes.
    • Normally installed SDK 2.4.2 and published Server 2.8.7/Workflow 2.5.32 pass the isolation, cache, reload, cold replacement, real connection outage, two common-driver mixed soaks, three comparison pairs and final baseline recheck. Exact outputs/history/deadlines and zero errors/drops/repairs/retries/pending work are preserved in the successful cells. Failed prior originals remain failed and linked.
    • Start with FPM for this recipe. Octane's 1.05% mean application CPU difference changes direction by pair and is smaller than 5.34% FPM drift, while charged memory increases about 185 MiB. Both record zero history-cache hits. Wire-byte costs include metadata and inline history; no pure-history-byte, replay-saving, execution-speedup or general capacity claim is made.

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    completion:evidence-requiredClose only after all explicit acceptance and operational evidence is publicintake:approvedCurrent issue title and body revision is approved for authority intakekind:featureA public product capability or experience is requestedpriority:P2Normal-priority product work

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions