Skip to content

Commit 31079e7

Browse files
committed
Merge branch 'master' from 'chrisboulton/php-resque-scheduler' into develop
2 parents 5c373ff + 5954c98 commit 31079e7

7 files changed

+585
-1
lines changed

README.md

+88
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ It also supports the following additional features:
5656
- Has built in support for `setUp` and `tearDown` methods, called pre and post
5757
jobs
5858

59+
Additionally it includes php-resque-scheduler, a PHP port of [resque-scheduler](http://github.com/resque/resque),
60+
which adds support for scheduling items in the future to Resque. It has been
61+
designed to be an almost direct-copy of the Ruby plugin
62+
63+
At the moment, php-resque-scheduler only supports delayed jobs, which is the
64+
ability to push a job to the queue and have it run at a certain timestamp, or
65+
in a number of seconds. Support for recurring jobs (similar to CRON) is planned
66+
for a future release.
67+
5968
This port was originally made by [Chris
6069
Boulton](https://github.com/chrisboulton), with maintenance by the community.
6170
See <https://github.com/chrisboulton/php-resque> for more on that history.
@@ -218,6 +227,43 @@ echo Resque_Job_PID::get($token);
218227

219228
Function returns `0` if the `perform` hasn't started yet, or if it has already ended.
220229

230+
## Delayed Jobs
231+
232+
To quote the documentation for the Ruby resque-scheduler:
233+
234+
> Delayed jobs are one-off jobs that you want to be put into a queue at some
235+
point in the future. The classic example is sending an email:
236+
237+
require 'Resque/Resque.php';
238+
require 'ResqueScheduler/ResqueScheduler.php';
239+
240+
$in = 3600;
241+
$args = array('id' => $user->id);
242+
ResqueScheduler::enqueueIn($in, 'email', 'SendFollowUpEmail', $args);
243+
244+
The above will store the job for 1 hour in the delayed queue, and then pull the
245+
job off and submit it to the `email` queue in Resque for processing as soon as
246+
a worker is available.
247+
248+
Instead of passing a relative time in seconds, you can also supply a timestamp
249+
as either a DateTime object or integer containing a UNIX timestamp to the
250+
`enqueueAt` method:
251+
252+
require 'Resque/Resque.php';
253+
require 'ResqueScheduler/ResqueScheduler.php';
254+
255+
$time = 1332067214;
256+
ResqueScheduler::enqueueAt($time, 'email', 'SendFollowUpEmail', $args);
257+
258+
$datetime = new DateTime('2012-03-18 13:21:49');
259+
ResqueScheduler::enqueueAt($datetime, 'email', 'SendFollowUpEmail', $args);
260+
261+
NOTE: resque-scheduler does not guarantee a job will fire at the time supplied.
262+
At the time supplied, resque-scheduler will take the job out of the delayed
263+
queue and push it to the appropriate queue in Resque. Your next available Resque
264+
worker will pick the job up. To keep processing as quick as possible, keep your
265+
queues as empty as possible.
266+
221267
## Workers
222268

223269
Workers work in the exact same way as the Ruby workers. For complete
@@ -355,6 +401,35 @@ functionality to PHP before 5.5, so if you'd like process titles updated,
355401
install the PECL module as well. php-resque will automatically detect and use
356402
it.
357403

404+
### Resque Scheduler
405+
406+
resque-scheduler requires a special worker that runs in the background. This
407+
worker is responsible for pulling items off the schedule/delayed queue and adding
408+
them to the queue for resque. This means that for delayed or scheduled jobs to be
409+
executed, that worker needs to be running.
410+
411+
A basic "up-and-running" `resque-scheduler.php` file that sets up a
412+
running worker environment is included (`vendor/resque-scheduler.php` when
413+
installed via composer). It accepts many of the same environment variables as
414+
the main workers for php-resque:
415+
416+
* `REDIS_BACKEND` - Redis server to connect to
417+
* `LOGGING` - Enable logging to STDOUT
418+
* `VERBOSE` - Enable verbose logging
419+
* `VVERBOSE` - Enable very verbose logging
420+
* `INTERVAL` - Sleep for this long before checking scheduled/delayed queues
421+
* `APP_INCLUDE` - Include this file when starting (to launch your app)
422+
* `PIDFILE` - Write the PID of the worker out to this file
423+
424+
The resque-scheduler worker requires resque to function. The demo
425+
resque-scheduler.php worker allows you to supply a `RESQUE_PHP` environment
426+
variable with the path to Resque.php. If not supplied and resque is not already
427+
loaded, resque-scheduler will attempt to load it from your include path
428+
(`require_once 'Resque/Resque.php';'`)
429+
430+
It's easy to start the resque-scheduler worker using resque-scheduler.php:
431+
$ RESQUE_PHP=./lib/Resque/Resque.php php resque-scheduler.php
432+
358433
## Event/Hook System
359434

360435
php-resque has a basic event system that can be used by your application to
@@ -462,6 +537,17 @@ passed (in this order) include:
462537
- Queue - string containing the name of the queue the job was added to
463538
- ID - string containing the new token of the enqueued job
464539

540+
### afterSchedule
541+
542+
Called after a job has been added to the schedule. Arguments passed are the
543+
timestamp, queue of the job, the class name of the job, and the job's arguments.
544+
545+
### beforeDelayedEnqueue
546+
547+
Called immediately after a job has been pulled off the delayed queue and right
548+
before the job is added to the queue in resque. Arguments passed are the queue
549+
of the job, the class name of the job, and the job's arguments.
550+
465551
## Step-By-Step
466552

467553
For a more in-depth look at what php-resque does under the hood (without needing
@@ -486,6 +572,7 @@ to directly examine the code), have a look at `HOWITWORKS.md`.
486572
- @andrewjshults
487573
- @atorres757
488574
- @benjisg
575+
- @biinari
489576
- @cballou
490577
- @chaitanyakuber
491578
- @charly22
@@ -511,6 +598,7 @@ to directly examine the code), have a look at `HOWITWORKS.md`.
511598
- @patrickbajao
512599
- @pedroarnal
513600
- @ptrofimov
601+
- @rayward
514602
- @richardkmiller
515603
- @Rockstar04
516604
- @ruudk

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
],
4646
"autoload": {
4747
"psr-0": {
48-
"Resque": "lib"
48+
"Resque": "lib",
49+
"ResqueScheduler": "lib"
4950
}
5051
},
5152
"extra": {

extras/resque-scheduler.monit

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Replace these with your own:
2+
# [PATH/TO/RESQUE]
3+
# [PATH/TO/RESQUE-SCHEDULER]
4+
# [UID]
5+
# [GID]
6+
# [APP_INCLUDE]
7+
8+
check process resque-scheduler_worker
9+
with pidfile /var/run/resque/scheduler-worker.pid
10+
start program = "/bin/sh -c 'APP_INCLUDE=[APP_INCLUDE] RESQUE_PHP=[PATH/TO/RESQUE] PIDFILE=/var/run/resque/scheduler-worker.pid nohup php -f [PATH/TO/RESQUE-SCHEDULER]/resque-scheduler.php > /var/log/resque/scheduler-worker.log &'" as uid [UID] and gid [GID]
11+
stop program = "/bin/sh -c 'kill -s QUIT `cat /var/run/resque/scheduler-worker.pid` && rm -f /var/run/resque/scheduler-worker.pid; exit 0;'"
12+
if totalmem is greater than 300 MB for 10 cycles then restart # eating up memory?
13+
group resque-scheduler_workers

0 commit comments

Comments
 (0)