Integration
PHP Laravel scheduler monitoring: every task
In a PHP Laravel application, the whole schedule runs from a single schedule:run every minute. If it stops, or one task stops, nothing tells you. The SilenceWatch package reads your schedule, declares every task with its real cron expression, and reports every run.
One package, one key
Section titled “One package, one key”composer require silencewatch/laravelSILENCEWATCH_API_KEY=sw_...That is the whole setup: Laravel discovers the package, and nothing in your schedule changes. The first time schedule:run runs a task, the whole schedule is declared in SilenceWatch with its real cron expressions, and each task sends a heartbeat around every run, with its duration and its failures. No check to create by hand, no ping URL to copy, nothing to keep in sync when you edit routes/console.php.
What sets it apart
Section titled “What sets it apart”- It listens, it does not wrap. The package uses the events Laravel’s scheduler already fires, so your tasks are not changed, and background tasks (
->runInBackground()) are reported with their exit code. - It reads the real schedules, with each task’s own time zone (
->timezone()), else the application’s. - It gives each task a stable identity (
artisan:backup:run --only-db,exec:/opt/scripts/export.sh,call:App\Jobs\PruneOrders): history survives deploys, renames and moves between servers. - It never deletes anything. A task that leaves the schedule is flagged orphaned; the history is kept until you delete it.
- It tells environments apart, with
APP_ENVby default: staging and production are two separate sets of checks. - It tells you what it does not watch.
php artisan silencewatch:syncdeclares the schedule at the end of a deploy script and lists the tasks left out, with the reason.
It cannot hurt you
Section titled “It cannot hurt you”- it never fails your task: every error is caught, and a task that succeeds is never reported to Laravel as failed because of the package;
- it costs almost nothing: PHP has no background thread, so a heartbeat is a request the scheduler waits for, at most two seconds, and once SilenceWatch has not answered, the other tasks of that run do not wait for it again;
- it degrades silently: with no key, no network or no server, the schedule runs exactly as without the package;
SILENCEWATCH_ENABLED=falseremoves the whole mechanism;- it has no dependency beyond Laravel itself. Laravel 12 and 13, PHP 8.2 or later.
All settings and limits are in the package documentation.
If your job is not in the Laravel scheduler
Section titled “If your job is not in the Laravel scheduler”Any job that can make an HTTP request can be monitored with the ping API. See cron job monitoring and the examples.
Frequently asked questions
Section titled “Frequently asked questions”How do I monitor the Laravel scheduler?
Run composer require silencewatch/laravel and set SILENCEWATCH_API_KEY. The first time schedule:run runs a task, the schedule is declared with its real cron expressions, and each task sends a heartbeat around every run.
Do I have to change my scheduled tasks?
No. The package listens to the events the scheduler already fires; your tasks are not wrapped or modified.
Which tasks are not watched?
A closure without a name (give it ->name()), a task with a condition such as between(), when() or skip(), because its cron expression says when it may run, not when it does, and nearest-weekday cron expressions. php artisan silencewatch:sync lists them with the reason.
Can the package slow down or break my scheduler?
No. Errors are caught, the wait is limited to the timeout (two seconds by default) and is skipped for the rest of a run once SilenceWatch has not answered, and with no key or no network the schedule runs as without the package.
Which versions are supported?
Laravel 12 and 13 on PHP 8.2 or later. The package is tested in CI on the oldest and the newest of those.