zendframework/zend-queue
Zend Queue provides a unified PHP interface for message queue systems, with adapters for arrays, databases, Memcache, MongoDB, and other backends. It supports sending, receiving, and processing messages through a consistent API, simplifying asynchronous job handling in Zend Framework applications.
What the package actually is. zendframework/zend-queue is a framework-agnostic queue abstraction from the Zend Framework 2/3 era: a Queue interface with pluggable adapters (Array, Null, Db, Mongo, Memcached, Redis, AMQP, Beanstalkd), plus message and exception primitives. It is not a Laravel package. It ships no service provider, no facade, no config stub, no artisan commands, no Illuminate\Contracts\Queue implementation, and no worker process. It is a library that predates and overlaps with the problem Laravel's queue component already solves.
Architecture fit: poor, and structurally duplicative. Laravel already owns a queue abstraction (Illuminate\Queue\Queue, Illuminate\Contracts\Queue\Queue, Job, Worker, QueueManager, failed-job storage, retries/backoff, events, and Horizon). Zend Queue sits at the same layer of the stack. Adopting it does not fill a gap; it introduces a second, parallel abstraction with different message semantics, different serialization expectations, and no shared failure model. The only coherent integration shape is a bridge: an adapter implementing Laravel's Queue contract, delegating to a Zend\Queue adapter. That is net-new code we own forever, written to preserve a dependency nobody maintains.
Integration feasibility: low. Concrete blockers a TPM should expect the engineering spike to surface:
zendframework/* components that were renamed to laminas/* and, in the queue case, subsequently archived too. A mixed estate running both zendframework/* and laminas/* packages risks duplicate-class and version-conflict resolution work.release/delete semantics, timeout handling, and failed-job persistence. None of that maps cleanly; each adapter would need bespoke behavior.Technical risk: high. Abandoned code with no security response, no PHP 8 guarantees, no maintainer, and a bridge layer we must design and own. The failure mode is not "it breaks on day one" — it is "it works quietly for eighteen months and then blocks a PHP upgrade, a framework upgrade, or a security audit."
Key questions for the sponsoring team:
opportunity: 10.63 score being read as "adopt this" or as "this is an under-served area"? Given archived status and zero dependents, the score reads as a market gap signal, not a build recommendation.Stack fit: not recommended for the Laravel path. For a Laravel service, the correct integration is no integration: select a native driver, configure config/queue.php, and move on. Zend Queue only becomes relevant in one narrow scenario — a polyglot or legacy Zend/Laminas estate where an existing producer or consumer already speaks a Zend Queue adapter and cannot be changed on our timeline.
Migration path (the only defensible one). Treat this as a decommissioning exercise, not an adoption:
database driver. Redis adapter → redis driver with Laravel's Lua-scripted pop. AMQP/Beanstalkd → sqs/beanstalkd or an external broker kept out of the PHP process. Mongo/Memcached adapters have weak delivery guarantees and should be retired rather than ported.Compatibility notes. Any fork must relax the PHP constraint, be validated on the target PHP 8 minor, and be pinned to an exact version with a recorded audit trail. Prefer vendoring or a private VCS fork over a dev- constraint; floating constraints on abandoned code are an outage waiting for a composer update. Verify there is no coexistence conflict if the same application resolves laminas/* components.
Sequencing. Do not sequence this alongside a framework upgrade. Land the native queue driver first, prove it in a non-critical consumer, then expand. Queue migration touches message durability and is a poor traveling companion for other platform changes.
Maintenance. Adoption means permanent ownership: PHP compatibility patching, security review on a codebase with no upstream, and a bridge layer that must track Laravel queue contract changes. Budget it as a standing line item, not a one-off integration — realistically a recurring percentage of an engineer per quarter, plus surge work at every Laravel major.
Support. None. No maintainer, no issue tracker, no CVE channel, no vendor. Internal escalation is the only path. In a regulated or audited environment, an archived dependency with zero dependents is also a finding waiting to be written up.
Scaling. Scaling characteristics are entirely adapter-dependent and generally weaker than Laravel's native equivalents: no built-in worker pool management, no visibility timeout, no atomic reserve-with-timeout, no failed-job store to query, and no metrics surface. Laravel's database and redis drivers give retries, backoff, failed_jobs, and Horizon observability out of the box; a Zend-backed bridge gives none of that unless we rebuild it.
Failure modes to plan for. Silent message loss on adapter restart (Memcached is volatile by design; Mongo and Memcached adapters offer no delivery guarantee). Poison messages with no dead-letter path, blocking a consumer indefinitely. Database adapter polling and locking contention against the application's own tables. No visibility into in-flight work, so a stuck consumer looks identical to an idle one. Bridging two abstractions adds a class of failure — dual-publish divergence — that does not exist in a single-abstraction design.
Ramp-up. Laravel engineers know dispatch(), jobs, and queue:work; they do not know Zend\Queue message objects or its adapter idiosyncrasies. Onboarding cost is a documented internal runbook plus a permanent context-switch tax on every queue-related incident. Native drivers require zero additional ramp-up.
Verdict. Given archived status, zero dependents, an outdated PHP constraint, and complete functional overlap with Laravel's queue component, the TPM recommendation is to reject adoption and treat the high opportunity score as a signal about the gap, not the package. Convert the opportunity into a short consolidation initiative: standardize on a native Laravel driver, map any legacy Zend Queue touchpoints onto it, and retire the dependency. If a legacy Zend producer genuinely cannot move on our timeline, contain it behind a time-boxed dual-publish shim with a named owner and a removal date — never as a resident dependency of the Laravel application.
How can I help you explore Laravel packages today?