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

Scheduler Bundle Laravel Package

guikingone/scheduler-bundle

A Symfony bundle for scheduling recurring tasks and console commands with cron expressions. Configure tasks via attributes or YAML, run them with a worker, and use transports to control synchronous or background execution.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit — poor for a Laravel stack, unchanged by 0.11.0. guikingone/scheduler-bundle is a Symfony bundle, not a Laravel package. It assumes Symfony's DI container, Bundle registration, FrameworkBundle configuration tree, and typically Symfony Messenger for dispatching and Symfony Lock for preventing duplicate execution. Laravel has no config/bundles.php, no Kernel::registerBundles(), and no equivalent of the Symfony configuration tree. "Installing" it in Laravel means either embedding a Symfony kernel alongside the Laravel kernel (two containers, two bootstraps, two config systems) or stripping the bundle down to its underlying services and registering them manually — at which point you have paid the adoption cost without the bundle's ergonomics. Nothing in this release touches the framework-integration boundary; both costs remain fully in force.

Functional overlap is near-total. Laravel's scheduler (routes/console.php / Console\Kernel, Schedule facade, schedule:run via cron or schedule:work) already covers recurring tasks, with first-party withoutOverlapping(), onOneServer(), runInBackground(), evenInMaintenanceMode(), and queue/job dispatch. The bundle's differentiators — persisted schedule state, a programmatic task model, and a message-driven execution path — are real but address a problem Laravel has already solved in a more idiomatic way for this team.

What 0.11.0 actually contains. Two dependency-level commits: a code-style/dependency refactor and added support for Symfony 8, plus routine dependency bumps. There are no new scheduling capabilities, no new persistence or observability surface, no deprecations, and no documented breaking changes. This is a compatibility-maintenance release, not a capability release — it does not move the functional comparison against Laravel's or Symfony's native schedulers.

Two things in 0.11.0 do matter, in opposite directions. First, shipping Symfony 8 support promptly is a positive maintenance signal: the package is being kept current against the newest Symfony major, which partially offsets the abandonment concern in the prior assessment. Second, the package is still 0.x — 0.11.0 is a minor bump, and under semver a 0.x minor is permitted to break. Combined with the fact that the version now tracks new Symfony majors, our upgrade cadence becomes coupled to Symfony's — which reinforces the version-lock risk below rather than relieving it. Note also that the release is credited to two named contributors (jmsche, ToshY); that is a marginally wider bus factor than one maintainer, but it is still a very small, unpaid group with no governance structure.

Technical risk — concentration and abandonment remain the decisive signals. 116 stars and zero dependents on Packagist are unchanged, and this release provides no evidence of new downstream adoption: no case studies, no integration reports, no dependent-count movement. There is still no observable usage, so edge cases in our environment will be found by us alone, and there is no ecosystem pressure steering the package. A small-maintainer project with no dependents has an unbounded bus-factor risk, and prompt Symfony 8 support does not alter that structural fact — it only means the bus is currently moving.

Key questions for the maintainer / spike (revised for 0.11.0):

  • Which Symfony majors remain in the tested matrix after 0.11.0 — is 7.x still supported, or has the bundle effectively moved to 8.x only?
  • What is the minimum PHP version implied by Symfony 8 support, and does our runtime qualify?
  • Does the dependency refactor in 003bb33 change any public API or container service IDs we would be wiring against?
  • Is 0.11.0 intended as a compatibility release on the path to 1.0, and what is the stated policy on breaking changes within 0.x?
  • Is a full Symfony kernel required, or can the scheduler services be instantiated standalone with hand-built dependencies?
  • What are the hard dependencies on Messenger, Lock, and a DBAL/ORM persistence layer — can any be swapped for Redis or a Laravel queue?
  • How is schedule state persisted, and is it safe under multi-node horizontal scaling?
  • Is there a fork/adoption contingency, and does the two-contributor cadence imply a successor maintainer?
  • Does the bundle expose observability hooks (events, logs, metrics) sufficient for our alerting?

Integration Approach

Stack fit verdict: do not integrate into the Laravel application — unchanged by 0.11.0. The correct recommendation remains rejected candidate with one narrow exception. A dependency-compatibility release cannot close a two-container architecture gap, and it introduces no capability that Laravel's scheduler lacks.

Primary path — no adoption. Map every requirement to Laravel's native scheduler. withoutOverlapping() + onOneServer() covers the concurrency and distributed-execution concerns the bundle exists to solve; a cache/Redis lock store gives us the same guarantee natively. Migration cost: zero. Compatibility risk: zero. This is the default and should require no further justification.

Narrow exception — Symfony estate, slightly strengthened but still hard to justify. Symfony 8 support means the bundle is viable for evaluation on a Symfony service rather than a Laravel one, which is the only place it was ever plausible. But that also sharpens the comparison: in that context it competes against Symfony's own Scheduler component, which ships on the framework's release cadence and carries first-party Symfony 8 support by definition. The bundle now at least has a fair footing on compatibility; it still has to win on capability against a component backed by the framework vendor. No release-note evidence suggests it does. Evaluate it there only if a Symfony service appears and the native component demonstrably cannot meet the requirement.

Sidecar path — only if a specific capability is truly unique. If the spike proves persisted, introspectable schedule state is a hard requirement we cannot meet with Laravel's scheduler, isolate the bundle in a separate Symfony console/worker service — which, post-0.11.0, can now target a current Symfony major — that owns the cron logic, and have it communicate with Laravel via the queue (Redis/SQS) or HTTP. This keeps the two containers disjoint, makes the boundary explicit, and lets us delete the sidecar without touching application code. Cost: a second deployable, a second runtime to patch, and a second on-call surface — justify it against a two-week build of the equivalent in Laravel.

Sequencing (if any path beyond rejection is pursued):

  1. Requirements diff — enumerate the concrete scheduling behaviours needed and confirm Laravel's scheduler cannot meet them.
  2. Re-baseline the dependency audit against 0.11.0 — confirm the Symfony 8 target and its implied PHP floor, and pin the exact tested combination.
  3. Timeboxed spike (≤5 days) in a throwaway branch: boot the bundle's services without a Symfony kernel; document exactly what breaks.
  4. Sidecar prototype against a single non-critical task, shadow-running beside the existing Laravel cron for two weeks to compare execution logs.
  5. Only then: architecture review with an explicit exit plan (fork, or revert to native).

Compatibility gates before any code is written: PHP version support matching our runtime — now the binding gate, since Symfony 8 support likely raises the floor and may exclude our current PHP version; Symfony major aligned with the bundle's tested range (confirm whether 0.11.0 dropped 7.x); persistence backend matching our primary datastore; and confirmation that the bundle's lock semantics work with our Redis/cache topology.

Operational Impact

Maintenance. MIT licence gives us fork rights, which is the mitigation for the abandonment risk. Budget for it: if the maintainers stop, we own the code, and we absorb breaking changes in Messenger/Lock/DI with no upstream fix. The 0.11.0 refactor commit is a small warning shot here — a "code style and deps" change landing in the same release as a framework-major bump is exactly the kind of churn a vendored fork has to re-validate. Pin the fork and review on every 0.x minor as though it were a major, because under semver it can be.

Support. Community-only: GitHub issues, no commercial backing, no SLA. Any production incident traces to a small group of unpaid contributors. This is acceptable for internal tooling; it is not acceptable for anything on a revenue path or a compliance-relevant cron (billing, reconciliation, notifications). 0.11.0 does not change this — a fast Symfony 8 release is evidence of engagement, not of a support commitment.

Scaling. The bundle's model is message-driven: a Messenger worker fleet consumes scheduled messages. Horizontal scaling is therefore a worker-count problem plus a lock-store problem — the lock backend becomes a hot path and a single point of correctness failure. Persisted schedule state grows monotonically; plan retention and archival from the start. Compare to Laravel's scheduler, which scales trivially with onOneServer() and adds no new runtime tier.

Failure modes to instrument before go-live:

  • Overlapping execution if the lock store is unavailable or misconfigured — duplicate side effects, double billing. Highest-severity risk.
  • Missed runs when the worker fleet is down or backed up; the scheduler enqueues but nothing consumes. Requires a dead-man's-switch alert on "expected task did not execute."
  • Silent failures — scheduled tasks that throw and are retried or dropped with no page. Needs per-task success/failure telemetry, not just worker health.
  • State drift between the persisted schedule and deploy-time code changes (renamed/removed tasks lingering in the table).
  • Worker memory growth in long-running consumers — enforce --time-limit and recycle.
  • Clock skew / timezone handling across nodes for date-bound tasks.
  • Version lock, now the sharper risk: 0.11.0 shows the bundle moving with Symfony majors. That keeps it current but also couples our upgrade cadence to Symfony's — a future Symfony 9 forces a bundle bump, and a stall there blocks the framework upgrade across the whole service. A 0.x policy that permits breaking minors compounds this.

Ramp-up. The team's mental model is Laravel's scheduler: facades, cron entries, withoutOverlapping(). This package requires a different model — Symfony DI wiring, Messenger transports, worker lifecycle, lock stores. Realistic ramp-up is 1–2 engineer-weeks before someone can debug a production scheduling failure unaided, and that knowledge is concentrated in whoever did the integration — now spread across a two-person upstream, which is not meaningfully better for our purposes. That is a knowledge-silo risk on top of the vendor risk, and it is the strongest operational argument for the rejection recommendation.

Net TPM position. 0.11.0 is a compatibility-maintenance release: Symfony 8 support and a dependency/style refactor, with no new capabilities, no deprecations, and no breaking changes documented. It improves the maintenance signal modestly — the package is being kept current — but it leaves all three drivers of the original recommendation untouched: the Symfony-vs-Laravel architecture gap, zero observed adoption, and a small-maintainer support model on a pre-1.0 version. Recommend reject for the Laravel platform, unchanged. Retain on a watch list for a Symfony service if one appears — where the bundle is now at least current enough to be evaluated against Symfony's native Scheduler — and revisit only if the native-scheduler gap analysis produces a concrete, unmet requirement.

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.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums