checkthiscloud/phpamqplib-messenger
Symfony Messenger transport for RabbitMQ built on the pure-PHP php-amqplib library instead of the php-amqp C extension. Point a phpamqplib DSN at your broker to create exchanges, queues, and bindings, and gain async consumers, efficient message streaming, and easier PHP upgrades.
Architecture Fit
checkthiscloud/phpamqplib-messenger is a Symfony bundle, not a Laravel package. It registers as Jwage\PhpAmqpLibMessengerBundle\PhpAmqpLibMessengerBundle in config/bundles.php and plugs a new transport into framework.messenger.transports via a phpamqplib:// DSN. That means it only fits stacks running Symfony FrameworkBundle (Symfony 6.4/7.x/8.x); a Laravel application would need to adopt Symfony's Messenger component and its bundle/DI bootstrapping first, which is a heavy architectural change and should be treated as out of scope unless Messenger is already in place.
Where the fit is genuinely strong:
ext-amqp C extension. The transport speaks AMQP through php-amqplib/php-amqplib in pure PHP. This matters when our base images are Alpine/distroless, when we cannot compile PECL extensions in CI or on managed runtimes, and when PHP minor upgrades historically break the extension before the library.php-amqplib streams from the broker with a blocking read and a fetchSize/prefetch hint instead of polling get(). That translates into lower idle CPU and lower message latency on low-volume queues.pcntl signal handling means a SIGTERM from Kubernetes or Supervisor lets the in-flight handler finish rather than aborting mid-message — a real operational win versus the known consume() behaviour of ext-amqp.docs/.Integration Feasibility
symfony/amqp-messenger: it is largely a DSN-scheme swap plus extension removal.PRECONDITION_FAILED.Technical Risk
0.x version line, and a single visible maintainer (@kralmichal). The Jwage\ root namespace signals a re-hosted or forked codebase under a new org. Under SemVer, 0.x permits breaking changes on minor bumps, and the 0.10 → 0.11 series already churned composer requirements (adding ext-sockets, bumping symfony/uid, adding symfony/dependency-injection). This is a pin-exact-version, review-every-upgrade dependency, not a floating one.symfony/phpamqplib-messenger around the 7.4 LTS line. That is good long-term news but creates a namespace and package migration somewhere in our future. Config should be isolated so the swap is a one-file change.symfony/messenger, symfony/dependency-injection, symfony/uid, and requires ext-sockets (added in 0.11.0). Version ranges must be reconciled with the rest of the app; a mixed Symfony minor set is the most likely first-day failure.docs/index.md; there is no published production runbook, no load/soak evidence, and no benchmark of confirms-on throughput. Real-world behaviour under our prefetch and message-size profile is unproven.0.x package is a signal to gate adoption behind our own compatibility test, not to trust the version number.Key Questions
ext-amqp actually blocked in our build or runtime (Alpine, distroless, managed platform, locked PECL)? If the extension installs cleanly, the business case weakens considerably.ext-sockets and accept the symfony/dependency-injection / symfony/uid constraints without conflicting with pinned versions?Jwage\… → symfony/phpamqplib-messenger namespace move — fork, adopt core, or fall back to symfony/amqp-messenger?Stack Fit
amqp:// transports and phpamqplib:// transports can run side by side in the same messenger.yaml, which is what makes a per-transport cutover possible.ext-sockets present in the image, composer resolution clean against our Symfony pins, network policy open to the broker, and vhost permissions that allow exchange/queue declaration (or a decision to declare out-of-band).Migration Path
framework.messenger.transports entry, note exchange/queue/DLX/retry settings, and capture current throughput and consumer lag as the comparison baseline.composer require --dry-run checkthiscloud/phpamqplib-messenger:0.11.2 against the app's lockfile; resolve symfony/messenger, symfony/dependency-injection, and symfony/uid conflicts deliberately, not by letting Composer drift. Pin the exact patch and commit the lockfile.config/bundles.php behind the all environment, and keep ext-amqp installed in the image for the duration of the pilot so rollback is a config revert, not a rebuild.phpamqplib://user:pass@rabbit:5672/vhost/orders_pilot, with explicit exchange type, durability, and DLX settings rather than relying on defaults.ext-amqp from the image and from CI, and simplify the Dockerfile accordingly.Compatibility and Sequencing Notes
fetchSize receiver hint; older 0.10.x will need an adapter shim when the framework advances.Jwage\ classes directly in application code.Maintenance
^0.11 floating ranges in production manifests.fetchSize release shows the maintainer tracking Symfony's transport contract, which is the right thing to watch.Support
Scaling
get() churn) and scales up predictably via prefetch/fetchSize and consumer replica count, since workers stay stateless.ext-amqp. Tune fetchSize/prefetch and confirms settings against measured latency budgets, not defaults.Failure Modes
PRECONDITION_FAILED on a mismatched exchange type or queue argument) — mitigation: align with broker-declared policies, or disable declaration and manage topology externally.--time-limit/--memory-limit recycling, and lag alerting rather than process-liveness alerting alone.composer update — mitigation: exact pins, lockfile commits, and a canary deploy for message-path services.symfony/amqp-messenger, and rollback tested during the pilot.Ramp-Up
amqp://.How can I help you explore Laravel packages today?