The BCC resque bundle provides integration of php-resque to Symfony2. It is inspired from resque, a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later.
- Creating a Job, with container access in order to leverage your Symfony services
- Enqueue a Job wih parameters on a given queue
- Creating background worker on a given queue
- A UX to monitor your queues, workers and job statuses
TODOs:
- Log management
- Integrate scheduler
- Job status tracking
- Redis configuration
- Localisation
- Tests
Make sure you have redis installed on your machine: http://redis.io/
Add to your bcc-resque-bundle
to your dependencies:
{
"require": {
...
"bcc/resque-bundle": "dev-master"
}
...
}
And make a php composer.phar update
.
<?php
// app/AppKernel.php
public function registerBundles()
{
return array(
// ...
new BCC\ResqueBundle\BCCResqueBundle(),
// ...
);
}
Add to your routing.yml
:
# app/config/routing.yml
BCCResqueBundle:
resource: "@BCCResqueBundle/Resources/config/routing.xml"
prefix: /resque
You can customize the prefix as you wish.
You can now acces the dashboard at this url: /resque
You may want to add some configuration to your config.yml
# app/config/config.yml
bcc_resque:
class: BCC\ResqueBundle\Resque # the resque class if different from default
vendor_dir: %kernel.root_dir%/../vendor # the vendor dir if different from default
redis:
host: localhost # the redis host
port: 6379 # the redis port
database: 1 # the redis database
A job is a subclass of the BCC\ResqueBundle\Job
class. You also can use the BCC\Resque\ContainerAwareJob
if you need to leverage the container during job execution.
You will be forced to implement the run method that will contain your job logic:
<?php
namespace My;
use BCC\ResqueBundle\Job;
class MyJob extends Job
{
public function run($args)
{
\file_put_contents($args['file'], $args['content']);
}
}
As you can see you get an $args parameter that is the array of arguments of your Job.
You can get the resque service simply by using the container. From your controller you can do:
<?php
// get resque
$resque = $this->get('bcc_resque.resque');
// create your job
$job = new MyJob();
$job->args = array(
'file' => '/tmp/file',
'content' => 'hello',
);
// enqueue your job
$resque->enqueue($job);
Just by using the following command you will create a worker on the default queue:
app/console bcc:resque:worker-start default
You can run a worker on several queues just separeate then using ,
. If you want a worker on every queues, just use *
.
You can also run a worker foreground by adding the --foreground
option;
You can change a job queue just by setting the queue
field of the job:
From within the job:
<?php
namespace My;
use BCC\ResqueBundle\Job;
class MyJob extends Job
{
public function __construct()
{
$this->queue = 'my_queue';
}
public function run($args)
{
...
}
}
Or from outsite the job:
<?php
// create your job
$job = new MyJob();
$job->job = 'my_queue';
Just extend the ContainerAwareJob
:
<?php
namespace My;
use BCC\ResqueBundle\ContainerAwareJob;
class MyJob extends ContainerAwareJob
{
public function run($args)
{
$doctrine = $this->getContainer()->getDoctrine();
...
}
}
Use the app/console bcc:resque:worker-stop
command.
- No argument will display running workers that you can stop.
- Add a worker id to stop it:
app/console bcc:resque:worker-stop ubuntu:3949:default
- Add the
--all
option to stop all the workers.