Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Commands Queues Bundle Laravel Package

serendipity_hq/commands-queues-bundle

Symfony bundle for queuing and running console commands as background jobs. It helps dispatch commands to a queue, process them asynchronously, and manage workers, making long-running PHP tasks easier to offload without blocking web requests and keep responses fast, with a simple, framework-friendly...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Important framing correction: despite being evaluated in a "Laravel/PHP package" bucket, this is a Symfony bundle (SerendipityHQ CommandsQueuesBundle), not a Laravel package. Its value proposition is a Doctrine-backed queue for Symfony Console commands — persist a command + arguments in a table, then drain it sequentially with a worker command. There is no ServiceProvider, no facade, no Laravel Job contract, and no publishable config in the Laravel idiom. Any evaluation must start there.

Architecture fit: Poor for direct integration, moderate as a design reference. The bundle assumes the Symfony Kernel, bundle registration in AppKernel/bundles.php, the Symfony DI container, Doctrine ORM entity mapping, and Console Application/Command lifecycle. Laravel's container, console kernel, and queue subsystem are structurally different. Forcing this in means booting a second framework kernel inside a Laravel app — an architecture smell that trades a solved problem (Laravel Queues) for a bespoke one.

Integration feasibility: Technically possible, practically discouraged.

  • Direct install depends entirely on whether the bundle's Symfony/Doctrine constraints can co-exist with Laravel's pinned symfony/* components. Laravel 10/11 ship Symfony 6/7 components; a bundle of this vintage likely constrains to Symfony 2/3/4 and older Doctrine. Composer will almost certainly refuse to resolve, and --ignore-platform-reqs/replace hacks are a production anti-pattern.
  • Sidecar install (separate Symfony process/container sharing the same database) is cleaner — the bundle owns its table, Laravel writes rows or vice versa — but now you operate two runtimes and two schemas for what Laravel Queues already does.
  • Concept port is the realistic path: reimplement the queue-table + sequential worker semantics natively in Laravel.

Technical risk: High.

  • Adoption signal is weak and contradictory. 10 stars, 0 dependents, one maintainer. A score of ~8.8 with opportunity 10.3 reads as "unmet need in a niche," not "proven component." Opportunity scores on low-adoption packages typically indicate whitespace, not readiness.
  • Maintenance status unverified and likely stale. Symfony bundles with this naming convention and Doctrine-coupled entities are usually pre-Symfony 5. Abandonment risk is the dominant risk, above any technical defect.
  • No Laravel-native ergonomics: no retries/backoff contracts, no failed_jobs semantics, no WithoutOverlapping, no horizon-style supervision, no queue priorities beyond what the bundle implements privately.
  • Schema ownership: Doctrine migrations vs. Laravel migrations for the same table is a coordination hazard.

Key questions to answer before any commitment:

  1. What are the declared composer.json constraints for php, symfony/*, and doctrine/*? Does a composer require --dry-run against our target Laravel version resolve at all?
  2. When was the last commit, last release, and last issue triage? Are there open PRs older than 12 months?
  3. Does the worker implement row-level locking / visibility timeouts, or is it a naive "select pending, mark processing, run" loop vulnerable to double-execution?
  4. Is there a timeout and signal-handling path for hung child processes? What happens to a row if the worker is SIGKILLed mid-run — does it strand in processing forever?
  5. What does the test suite cover, and does CI run on any currently-supported PHP?
  6. Which specific problem did we think this solves that Laravel's database queue driver plus Process does not?

If Q6 has no crisp answer, the correct decision is "do not integrate."

Integration Approach

Stack fit: Laravel is the wrong host for this artifact; Symfony is the right one. If the estate is Laravel-first, treat the bundle as prior art, not a dependency. Its genuine idea — a durable, inspectable, DB-backed queue for shell commands that is operable without Redis/RabbitMQ — maps cleanly onto constructs Laravel already ships.

Recommended approach (concept port, not package adoption):

  • Persist work with Laravel's database queue driver (or a small custom queue_jobs-style table if we want command-shaped payloads and admin visibility).
  • Model each shell command as a first-class Job class that builds a Symfony\Component\Process\Process, sets an explicit setTimeout(), captures stdout/stderr, and throws on non-zero exit so Laravel's retry/backoff/failed-job machinery engages.
  • Add WithoutOverlapping middleware for commands that must not run concurrently, plus onQueue()/onConnection() for lane separation (mirroring the bundle's "queue" concept).
  • Use artisan queue:work --max-time under Supervisor/systemd; this replaces the bundle's worker command directly and is a well-trodden operational pattern.
  • For scheduled dispatch, use Artisan::queue() or a Kernel::schedule() entry rather than a Symfony console invocation table.

If direct reuse is mandated (e.g. existing Symfony service must be shared): Run the bundle in its native Symfony application as an isolated worker process writing to a shared database, and have Laravel interact only through that table via a thin repository. Enforce a single owner of migrations for that table (Symfony side), and have Laravel read-only plus a narrow, documented insert path. Do not attempt to boot the Symfony kernel inside Laravel.

Compatibility gates (must pass, in order):

  1. composer require serendipity_hq/commands-queues-bundle --dry-run against the target Laravel version — hard fail if it does not resolve.
  2. php -l / PHPStan level 5 over the installed vendor tree; confirm no deprecated PHP constructs (dynamic properties, each()-era patterns) on our PHP version.
  3. Doctrine entity mapping loads cleanly against our DBAL version; no schema drift against an existing commands_queue table.
  4. Worker behaviour verified under kill -9: no stranded processing rows, or a documented reconciliation command.

Sequencing:

  1. Day 1–2 — feasibility spike. Read composer.json, README, and the worker command source. Run the dry-run resolve. Publish a go/no-go memo.
  2. Week 1 — comparative proof. Implement one representative command (e.g. a long-running import) twice: once with the bundle in a throwaway Symfony skeleton, once as a Laravel Job + Process. Compare lines of code, failure handling, and observability.
  3. Week 2 — decision. Unless the Symfony estate is already the primary runtime, adopt the Laravel-native port. Record the bundle as the design source in an ADR.
  4. Week 3–4 — hardening. Timeouts, retries, failure alerting, queue depth dashboards, and a runbook for stuck jobs.
  5. Deferred: revisit only if a hard cross-framework requirement appears.

Operational Impact

Maintenance: This is the decisive factor. Ten stars and zero dependents means effectively no downstream validation — we would be among the first production consumers. Assume unmaintained: budget for a vendored fork (repositories with a VCS entry, or a patches file) and for owning security and PHP-version upgrades ourselves. If we cannot staff that, do not take the dependency. The Laravel-native port has zero external maintenance surface and inherits Laravel's release cadence.

Support: Single-maintainer project with no evident commercial backing. No SLA, no security disclosure process, unknown issue response latency. Internal escalation path must be "we fix it," which means the real cost of adoption is a part-time maintainer, not a composer require.

Scaling:

  • The bundle's model is a sequential DB-backed drain. Throughput is bounded by DB round-trips per job and by row-lock contention once more than one worker polls the same queue.
  • No native visibility-timeout, delayed-job, or priority semantics comparable to Laravel's; horizontal scaling requires either per-queue worker partitioning (operationally fiddly) or accepting a single worker per queue.
  • Long-running shell commands dominate wall-clock time, so concurrency, not queue depth, is the constraint. Plan for N supervised workers sharded by queue name, each with a hard --max-time to bound memory growth.
  • Verdict: adequate for tens-to-low-hundreds of jobs/day of heavyweight commands — the bundle's actual sweet spot. Unsuitable for high-fan-out or latency-sensitive workloads.

Failure modes to instrument from day one:

  • Stranded processing rows after worker crash — add a reconciliation sweep that ages out rows past a threshold.
  • Duplicate execution from missing/incorrect row locking — make target commands idempotent regardless.
  • Hung child process with no timeout — enforce Process::setTimeout() explicitly; the bundle may not.
  • Memory creep in a long-lived worker (Doctrine's identity map is a known culprit) — cap --max-time and restart.
  • Database as SPOF — queue depth and lock waits become application availability signals; alert on both.
  • Schema ownership conflict between Doctrine migrations and Laravel migrations if both runtimes touch the table.

Ramp-up: Non-trivial for a Laravel-first team. Required knowledge: Symfony bundle registration and DI configuration, Doctrine ORM entity/migration lifecycle, Symfony Console command and event internals, and Composer constraint resolution across two framework generations. Realistically 2–4 days of a senior engineer to reach confident operation, versus roughly half a day for the Laravel-native equivalent using Bus, Process, and Supervisor. That delta alone usually settles the build-vs-adopt question.

Net TPM recommendation: Do not adopt as a dependency for a Laravel application. Use it as a documented reference implementation for a DB-backed command queue and ship the Laravel-native equivalent. Revisit only if the organisation standardises on Symfony, at which point the bundle deserves a fresh evaluation against Symfony Messenger — which, notably, already covers this ground with active maintenance and a large adopter base.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core
nodisrupt/laravel-agent
sierratecnologia/media-manager