Need help with BCCResqueBundle?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

125 Stars 96 Forks 188 Commits 36 Opened issues


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.

Services available


Need anything else?

Contributors list

Intro to BCCResqueBundle

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 with parameters on a given queue
  • Creating background worker on a given queue
  • A UX to monitor your queues, workers and job statuses
  • ability to schedule jobs to run at a specific time or after a number of seconds delay
  • ability to auto re-queue failed jobs, with back-off strategies

TODOs: - Log management - Job status tracking - Redis configuration - Localisation - Tests



Installation and configuration:


Make sure you have redis installed on your machine:

Get the bundle

Add to your

to your dependencies:
    "require": {
        "bcc/resque-bundle": "dev-master"

To install, run

php composer.phar [update|install]

Add BCCResqueBundle to your application kernel

Import the routing configuration

Add to your

# app/config/routing.yml
    resource: "@BCCResqueBundle/Resources/config/routing.xml"
    prefix:   /resque

You can customize the prefix as you wish.

You can now access the dashboard at this url:


To secure the dashboard, you can add the following to your

- provided your administrator role is
        - { path: ^/resque, roles: ROLE_ADMIN }

Optional, secure the dashboard behind a role

Add to your

# app/config/security.yml
    - { path: ^/resque, roles: ROLE_ADMIN }

Now only users with the role ROLE_ADMIN will be able to access the dashboard at this url:


Optional, set configuration

You may want to add some configuration to your

# app/config/config.yml
    class: BCC\ResqueBundle\Resque           # the resque class if different from default
    vendor_dir: %kernel.root_dir%/../vendor  # the vendor dir if different from default
    prefix: my-resque-prefix                 # optional prefix to separate Resque data per site/app
        host: localhost                      # the redis host
        port: 6379                           # the redis port
        database: 1                          # the redis database
    auto_retry: [0, 10, 60]                  # auto retry failed jobs
        root_dir: path/to/worker/root        # the root dir of app that run workers (optional)

See the Auto retry section for more on how to use



worker: root_dir:
in case job fails to run when worker systems are hosted on separate server/dir from the system creating the queue. When running multiple configured apps for multiple workers, all apps must be able to access by the same rootdir defined in `worker: rootdir`.

Optional, configure lazy loading

This bundle is prepared for lazy loading in order to make a connection to redis only when its really used. Symfony2 supports that starting with 2.3. To make it work an additional step needs to be done. You need to install a proxy manager to your Symfony2 project. The full documentation for adding the proxy manager can be found in Symfony2's Lazy Service documentation.

Creating a Job

A job is a subclass of the

class. You also can use the
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:
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.

Adding a job to a queue

You can get the resque service simply by using the container. From your controller you can do:


// create your job $job = new MyJob(); $job->args = array( 'file' => '/tmp/file', 'content' => 'hello', );

// enqueue your job $resque->enqueue($job);

Running a worker on a queue

Executing the following commands will create a work on : - the

queue :
app/console bcc:resque:worker-start default
- the
queue :
app/console bcc:resque:worker-start q1,q2
(separate name with
) - all existing queues :
app/console bcc:resque:worker-start "*"

You can also run a worker foreground by adding the


By default

environment variable is set when calling php-resque -
option sets
disables both so no debug output is thrown

See php-resque logging option :

Adding a delayed job to a queue

You can specify that a job is run at a specific time or after a specific delay (in seconds).

From your controller you can do:


// create your job $job = new MyJob(); $job->args = array( 'file' => '/tmp/file', 'content' => 'hello', );

// enqueue your job to run at a specific \DateTime or int unix timestamp $resque->enqueueAt(\DateTime|int $at, $job);

// or

// enqueue your job to run after a number of seconds $resque->enqueueIn($seconds, $job);

You must also run a

, which is responsible for taking items out of the special delayed queue and putting them into the originally specified queue.

app/console bcc:resque:scheduledworker-start

Stop it later with

app/console bcc:resque:scheduledworker-stop

Note that when run in background mode it creates a PID file in 'cache//'. If you clear your cache while the scheduledworker is running you won't be able to stop it with the


Alternatively, you can run the scheduledworker in the foreground with the


Note also you should only ever have one scheduledworker running, and if the PID file already exists you will have to use the

option to start a scheduledworker.

Manage production workers with supervisord

It's probably best to use supervisord ( to run the workers in production, rather than re-invent job spawning, monitoring, stopping and restarting.

Here's a sample conf file

command = /usr/bin/php /home/sites/myapp/prod/current/vendor/bcc/resque-bundle/BCC/ResqueBundle/bin/resque
user = myusername
environment = APP_INCLUDE='/home/sites/myapp/prod/current/vendor/autoload.php',VERBOSE='1',QUEUE='default'

[program:myapp_phpresque_scheduledworker] command = /usr/bin/php /home/sites/myapp/prod/current/vendor/bcc/resque-bundle/BCC/ResqueBundle/bin/resque-scheduler user = myusername environment = APP_INCLUDE='/home/sites/myapp/prod/current/vendor/autoload.php',VERBOSE='1',RESQUE_PHP='/home/sites/myapp/prod/current/vendor/chrisboulton/php-resque/lib/Resque.php' stopsignal=QUIT

[group:myapp] programs=myapp_phpresque_default,myapp_phpresque_scheduledworker

(If you use a custom Resque prefix, add an extra environment variable: PREFIX='my-resque-prefix')

Then in Capifony you can do

sudo supervisorctl stop myapp:*
before deploying your app and
sudo supervisorctl start myapp:*

More features

Changing the queue

You can change a job queue just by setting the

field of the job:

From within the job:

use BCC\ResqueBundle\Job;

class MyJob extends Job { public function __construct() { $this->queue = 'my_queue'; }

public function run($args)


Or from outside the job:

queue = 'my_queue';

Access the container from inside your job

Just extend the

use BCC\ResqueBundle\ContainerAwareJob;

class MyJob extends ContainerAwareJob { public function run($args) { $doctrine = $this->getContainer()->getDoctrine(); ... } }

Stop a worker

Use the

app/console bcc:resque:worker-stop

  • 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
    option to stop all the workers.

Auto retry

You can have the bundle auto retry failed jobs by adding

retry strategy
for either a specific job, or for all jobs in general:

The following will allow

to retry 3 times.
  • right away
  • after a 10 second delay
  • after a 60 second delay
        Some\Job: [0, 10, 60]

Setting strategy for all jobs:

    auto_retry: [0, 10, 60]

With default strategy for all but specific jobs:

        default:        [0, 10, 60]
        Some\Job:       [0, 10, 120, 240]
        Some\Other\Job: [10, 30, 120, 600]


strategy (if provided) will be applied to all jobs that does not have a specific strategy attached. If not provided these jobs will not have auto retry.

You can disable

for selected jobs by using an empty array:
        default:        [0, 10, 60]
        Some\Job:       []
        Some\Other\Job: [10, 30, 120, 600]


will not have any

Please note

To use the

feature, you must also run the scheduler job:

app/console bcc:resque:scheduledworker-start

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.