chrisboulton/php-resque-scheduler
Installation
composer require chrisboulton/php-resque-scheduler
Ensure php-resque is also installed (chrisboulton/php-resque).
Configure Redis
The scheduler relies on Redis for job persistence. Ensure your config/database.php has a Redis connection configured.
Basic Setup
Add the scheduler to your config/app.php service providers:
'providers' => [
// ...
Chrisboulton\PhpResqueScheduler\SchedulerServiceProvider::class,
],
First Use Case: Delayed Job Schedule a job to run in 5 minutes:
use Chrisboulton\PhpResqueScheduler\Scheduler;
$scheduler = app(Scheduler::class);
$scheduler->schedule(
'job_name', // Resque job name
time() + 300, // Unix timestamp (5 minutes from now)
['param1' => 'value1'] // Job payload
);
Recurring Jobs
Use scheduleRecurring() for periodic tasks (e.g., cron-like jobs):
$scheduler->scheduleRecurring(
'daily_backup',
'0 3 * * *', // Cron syntax
['backup_path' => '/path/to/backup']
);
Dynamic Scheduling Schedule jobs based on runtime logic (e.g., user actions):
$delay = $user->isPremium() ? 60 : 300; // 1 min for premium, 5 min for others
$scheduler->schedule('send_email', time() + $delay, ['user_id' => $user->id]);
Integration with Laravel Queues
Use Resque::enqueue() for immediate jobs and Scheduler for delayed ones:
if ($urgent) {
Resque::enqueue('urgent_job', ['data' => $data]);
} else {
$scheduler->schedule('delayed_job', time() + 3600, ['data' => $data]);
}
Batch Processing Schedule multiple jobs at once:
$jobs = [
['job' => 'process_order', 'args' => [$order->id], 'at' => time() + 10],
['job' => 'cleanup_logs', 'args' => [], 'at' => time() + 86400], // Tomorrow
];
foreach ($jobs as $job) {
$scheduler->schedule($job['job'], $job['at'], $job['args']);
}
php resque.php -w worker_name --scheduler
use Chrisboulton\PhpResqueScheduler\Scheduler;
class ScheduleCommand extends Command {
protected $scheduler;
public function __construct(Scheduler $scheduler) {
$this->scheduler = $scheduler;
}
public function handle() {
$this->scheduler->schedule('daily_report', time() + 86400);
}
}
redis-cli LRANGE resque:scheduler:jobs 0 -1
Redis Connection Issues
redis-cli PING
Time Zone Mismatches
scheduleRecurring() uses the server’s time zone. Convert timestamps explicitly if needed:
$timestamp = Carbon::now()->timezone('UTC')->timestamp + 3600;
Job Overlapping
redis-cli EXISTS resque:job:unique_key
Worker Stuck on Scheduler
redis-cli KEYS "resque:locked:*"
Scheduler class to log jobs:
class CustomScheduler extends Scheduler {
public function schedule($job, $at, $args = []) {
Log::info("Scheduled job {$job} at {$at}");
return parent::schedule($job, $at, $args);
}
}
redis-server) and mock the scheduler in tests:
$this->app->instance(Scheduler::class, MockScheduler::class);
Custom Job Classes
Extend Chrisboulton\PhpResqueScheduler\Job to add metadata or validation:
class CustomJob extends Job {
public function validate($args) {
if (empty($args['required_field'])) {
throw new \InvalidArgumentException('Field is required');
}
}
}
Event Listeners Listen for job scheduling events (e.g., log or notify):
event(new JobScheduled($job, $at, $args));
Redis Key Prefixes
Override the default Redis keys by binding a custom Redis instance:
$this->app->bind('redis', function () {
return Redis::connection('custom_redis');
});
Fallback for Failed Jobs Implement a retry mechanism for failed scheduled jobs:
$scheduler->schedule('fallback_job', time() + 60, ['original_job' => $job]);
How can I help you explore Laravel packages today?