tourze/symfony-workerman-bundle
A Symfony bundle that integrates Workerman into Symfony applications, helping you run and manage persistent, event-driven Workerman workers and servers alongside your existing Symfony services, configuration, and console commands with minimal setup.
Architecture fit: tourze/symfony-workerman-bundle is, by name and namespace, a Symfony bundle that bridges Workerman (a PHP event-loop/socket server runtime) into the Symfony DI and kernel lifecycle. That is a meaningful mismatch with a Laravel-centric stack: Laravel has no bundle registration mechanism, no Kernel::boot() bundle hook, and no service-container compiler passes matching Symfony's. Even though the package is installable via Composer and PHP-compatible, its intended integration surface is Symfony's framework contract. For a Laravel product, this would require wrapping or reimplementing the bundle's bootstrapping in a Laravel service provider — non-trivial and unsupported by upstream.
Integration feasibility: Low to moderate for direct adoption; moderate for a "borrow the patterns" evaluation. The artifact under review is version 0.0.1 with no release description beyond a changelog link — no README excerpt, no stated support matrix, no documented Laravel or Symfony version constraints in the provided data. Composer can resolve it, but resolving is not integrating. Practical feasibility depends on whether we intend to run Workerman as a long-lived server (e.g. HTTP worker, queue consumer, websocket) alongside Laravel; nothing in the release evidence suggests the package addresses Laravel's lifecycle concerns such as container state bleed across requests, config/session re-initialization, or Application::flush() semantics.
Technical risk: High, driven mostly by lifecycle and maturity:
0.0.1 explicitly carries no API stability guarantee. Symfony bundles at this version routinely rename services, config keys, and compiler passes. Budget for breakage on every bump.0.0.1 release from a single-vendor org with no release narrative is a supply-chain and longevity risk. Need to check commit cadence, maintainer count, issue responsiveness, and download counts before committing production traffic.dd()/dump(), Xdebug, and standard Laravel error handling behave differently; stack traces may be truncated in worker forks. Expect a real increase in mean time to diagnose.Key questions:
laravel/octane + Swoole/RoadRunner/FrankenPHP)? If yes, why is this package under consideration at all?Stack fit: Poor as a drop-in for Laravel. The bundle targets Symfony's container and kernel; Laravel's service provider model is structurally different. Realistically this is not an integration of the package but an integration of Workerman itself, using this bundle as a reference implementation for bootstrapping patterns. Sequence accordingly: decide first whether Workerman is the runtime we want, then decide whether this package helps.
Migration path: Recommended staged path if we proceed:
Compatibility: Treat every dependency as unverified until tested. Pin exact versions. Composer's constraint solver will happily install a combination that has never been run together. Specifically validate PHP version, Symfony components pulled transitively, ext-event / ext-pcntl availability on the target hosts (Workerman needs these or falls back to slower modes), and interaction with Laravel's queue and session drivers. Note that 0.0.1 almost certainly has undocumented breaking changes on the way to 0.1; do not build a public API on top of it.
Sequencing: Do not let this package block any committed roadmap. Run the spike in parallel with normal delivery. Establish the Octane comparison before the pilot, not after. Only sequence production migration after the pilot's exit criteria are written down and met.
Maintenance: We inherit the maintenance burden of both the runtime shift and (most likely) an adapter layer of our own. The package itself has no maintenance commitment we can point to at 0.0.1 — no changelog content beyond a compare link, no deprecation policy, no LTS. Expect to track upstream manually and to vendor-fork if it stalls. Add this to the on-call team's ownership, with a named owner.
Support: No commercial support path, no evident community of scale. Internal expertise must be built, not hired — Workerman skills are far rarer in the market than Laravel/FPM skills. Escalation for production incidents is effectively "our own engineers figure it out." This should be reflected in the support tier we promise for any service built on it.
Scaling: Workerman scales via worker count and event-loop concurrency, which is genuinely good at holding many idle connections cheaply (websockets, SSE, long-poll). It scales less predictably for CPU-bound work, where you are back to tuning worker counts and watching memory ceilings. Key operational levers: worker count, max_requests-style worker recycling to bound memory growth from leaks, and connection-limit tuning at the OS and load-balancer level. Capacity planning assumptions from current FPM deployments will not transfer — re-measure.
Failure modes: Enumerate and instrument these before launch:
0.0.x bump, potentially at install time.Ramp-up: Significant and multi-disciplinary. Engineers must unlearn FPM assumptions (per-request bootstrap, no shared state, exit is safe) and learn event-loop discipline (no blocking I/O, no unbounded loops, careful static usage). Ops/SRE must learn a new deploy and supervision model. Expect 2–4 weeks before a mid-level engineer is productive and considerably longer before the team is confident in production failure modes. Documentation will be largely self-authored, since the upstream release notes here provide none.
Recommendation: Do not adopt on the basis of a 0.0.1 release with no accompanying documentation. Treat this as a signal to evaluate whether we need a persistent-PHP runtime at all, and if so, default to Laravel Octane on FrankenPHP or RoadRunner. Revisit this package only if a concrete requirement (e.g. bidirectional websockets at scale) is not served by the supported options, and only after the spike described above.
How can I help you explore Laravel packages today?