silpo-tech/openswoole-bundle
A Symfony bundle for running applications on OpenSwoole. It wires OpenSwoole HTTP/WebSocket servers into Symfony, provides configuration and integration for kernel handling, coroutines, and long-running workers, helping build high-performance PHP services with familiar Symfony conventions.
Architecture fit. The first finding is a stack mismatch: despite being routed as a "Laravel/PHP package," silpo-tech/openswoole-bundle is explicitly a Symfony bundle. It registers a kernel/runtime integration for OpenSwoole inside a Symfony application (services, DI container, console commands). It cannot be dropped into a Laravel application as-is; a Laravel team would be consuming a foreign framework's bootstrapping conventions. For a Laravel-centric stack the practical equivalent is Laravel Octane, which already wraps OpenSwoole (and Swoole, RoadRunner, FrankenPHP) behind a first-party service provider. That reduces this package's addressable value for a Laravel shop to near zero unless we also operate Symfony services.
Integration feasibility. Where Symfony is in play, the integration is mechanically straightforward: PECL-install openswoole, register the bundle, point the runtime at the OpenSwoole worker, configure worker counts and host/port. The real work is not installation but application fitness for a long-running worker model — eliminating request-scoped state leakage, validating Doctrine connection lifecycle and reconnection, auditing blocking I/O, and confirming that third-party bundles are worker-safe. This package provides the runtime plumbing; it does not make an application stateless.
Technical risk.
Key questions.
Stack fit. Treat this as Symfony-only. For a Laravel codebase, the recommendation is to reject it and evaluate Laravel Octane instead; the only exception is an organisation running both frameworks and standardising on a single OpenSwoole operating model across them — and even then, a shared runtime choice does not justify a shared bundle.
Migration path. Do not migrate onto this package. If the goal is "move off PHP-FPM to a persistent worker model," the ordered options are:
If a Symfony service must adopt it, the path is a strangler-style pilot: one non-critical, stateless HTTP service behind the bundle, unchanged behaviour behind a feature flag, with FPM retained as the rollback target.
Compatibility. Confirm PHP 8.2/8.3 support, OpenSwoole extension version pinning against the bundle's constraints, Symfony 6.4/7.x coverage, and Doctrine DBAL/ORM worker-mode compatibility. Version drift between the PECL extension and the bundle is the most likely day-one breakage.
Sequencing.
Maintenance. Expect to own most of it. With zero dependents and a single sponsoring organisation, upstream fixes for framework-version breaks may lag or never arrive. Budget for the possibility of forking the bundle or replacing it with an in-house bootstrap within 12–18 months. Pin versions and avoid floating constraints.
Support. No vendor SLA, no commercial support tier, no evidence of an active issue queue. Internal engineers become the de facto maintainers. Compare against Octane/RoadRunner, where answers exist in public and hiring is easier.
Scaling. The worker model changes the scaling unit from "PHP-FPM process per request" to "long-lived worker with N coroutines." Benefits are real — reduced bootstrap overhead, lower memory per request, better tail latency — but they only materialise with tuning: worker count versus CPU, max_request recycling to bound memory growth, connection-pool sizing so workers do not exhaust Postgres/MySQL max_connections, and load-balancer/health-check behaviour for workers that stop accepting connections during recycling.
Failure modes.
max_request and soak testing.sleep, large file reads) stalls the whole worker and serialises concurrent requests, producing latency cliffs under load.xdebug is impractical in production, and familiar FPM profiling workflows no longer apply — mean time to diagnose increases for the first several months.Ramp-up. Allow a genuine learning curve: coroutine/async semantics, worker lifecycle, and pool tuning are unfamiliar to most PHP teams, and the failure modes above are subtle. A realistic estimate is 4–8 weeks before a team is confident operating this in production, versus 1–2 weeks for Octane or RoadRunner where documentation and community examples exist. Factor that into the total cost of ownership, alongside the likely future migration off a package with 3 stars and no dependents — which, on current evidence, is the most probable outcome.
How can I help you explore Laravel packages today?