2017 © Pedro Peláez

library queue-doctrine

Zend Framework module that integrates Doctrine as queuing system



Zend Framework module that integrates Doctrine as queuing system

  • Wednesday, August 1, 2018
  • by juriansluiman
  • Repository
  • 5 Watchers
  • 25 Stars
  • 53,294 Installations
  • PHP
  • 6 Dependents
  • 1 Suggesters
  • 31 Forks
  • 6 Open issues
  • 19 Versions
  • 10 % Grown



Latest Stable Version Latest Unstable Version Coverage Status, (*1)

Created by Stefan Kleff, (*2)


Note: it's necessary require the doctrine package in composer.json file., (*3)


Add the following line into your composer.json file:, (*4)

"require": {
    "slm/queue-doctrine": "^3.0"

If you have the laminas/laminas-component-installer package installed, it will ask you to enable the module (and SlmQueue), both in Laminas and Mezzio. Otherwise, add the module to the list: * in Laminas MVC, enable the module by adding SlmQueueDoctrine in your application.config.php file. * in Mezzio, enable the module by adding SlmQueueDoctrine\ConfigProvider::class, in your config.php file., (*5)

Note: Don't forget install SlmQueue in you config file, which is required., (*6)


Before reading SlmQueueDoctrine documentation, please read SlmQueue documentation., (*7)

Configuring the connection

You need to register a doctrine connection which SlmQueueDoctrine will use to access the database into the service manager. Here are some examples., (*8)

Connection parameters can be defined in the application configuration:, (*9)

return array(
    'doctrine' => array(
        'connection' => array(
            // default connection name
            'orm_default' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => array(
                    'host'     => 'localhost',
                    'port'     => '3306',
                    'user'     => 'username',
                    'password' => 'password',
                    'dbname'   => 'database',

Creating the table from SQL file

You must create the required table that will contain the queue's you may use the schema located in 'data/queue_default.sql'. If you change the table name look at Configuring queues, (*10)

>mysql database < data/queue_default.sql

Creating the table from Doctrine Entity

There is an alternative way to create 'queue_default' table in your database by copying Doctrine Entity 'date/DefaultQueue.php' to your entity folder ('Application\Entity' in our example) and executing Doctrine's 'orm:schema-tool:update' command which should create the table for you. Notice that DefaultQueue entity is only used for table creation and is not used by this module internally., (*11)

Adding queues

return array(
  'slm_queue' => array(
    'queue_manager' => array(
      'factories' => array(
        'foo' => 'SlmQueueDoctrine\Factory\DoctrineQueueFactory'

Adding jobs

return array(
  'slm_queue' => array(
    'job_manager' => array(
      'factories' => array(
        'My\Job' => 'My\JobFactory'

Configuring queues

The following options can be set per queue ;, (*12)

  • connection (defaults to 'doctrine.connection.orm_default') : Name of the registered doctrine connection service
  • table_name (defaults to 'queue_default') : Table name which should be used to store jobs
  • deleted_lifetime (defaults to 0) : How long to keep deleted (successful) jobs (in minutes)
  • buried_lifetime (defaults to 0) : How long to keep buried (failed) jobs (in minutes)
return array(
  'slm_queue' => array(
    'queues' => array(
      'foo' => array(
        // ...

Provided Worker Strategies

In addition to the provided strategies by [SlmQueue](https://github.com/juriansluiman/SlmQueue/blob/master/docs/6.Events.md) SlmQueueDoctrine comes with these strategies;

#### ClearObjectManagerStrategy

This strategy will clear the ObjectManager before execution of individual jobs. The job must implement the [DoctrineModule\Persistence\ObjectManagerAwareInterface](https://github.com/doctrine/DoctrineModule/blob/master/src/DoctrineModule/Persistence/ObjectManagerAwareInterface.php) or [SlmQueueDoctrine\Persistence\ObjectManagerAwareInterface](https://github.com/juriansluiman/SlmQueueDoctrine/blob/master/src/Persistence/ObjectManagerAwareInterface.php).

listens to:

- `process.job` event at priority 1000


- none

This strategy is enabled by default.

#### IdleNapStrategy

When no jobs are available in the queue this strategy will make the worker wait for a specific amount time before quering the database again.

listens to:

- `process.idle` event at priority 1


- `nap_duration` defaults to 1 (second)

This strategy is enabled by default.

### Operations on queues

#### push

Valid options are:

* scheduled: the time when the job will be scheduled to run next
    * numeric string or integer - interpreted as a timestamp
    * string parserable by the DateTime object
    * DateTime instance
* delay: the delay before a job become available to be popped (defaults to 0 - no delay -)
    * numeric string or integer - interpreted as seconds
    * string parserable (ISO 8601 duration) by DateTimeInterval::__construct
    * string parserable (relative parts) by DateTimeInterval::createFromDateString
    * DateTimeInterval instance
* priority: the lower the priority is, the sooner the job get popped from the queue (default to 1024)

    // scheduled for execution asap

    // will get executed before jobs that have higher priority
    $queue->push($job, [
        'priority' => 200,

    // scheduled for execution 2015-01-01 00:00:00 (system timezone applies)
    $queue->push($job, array(
        'scheduled' => 1420070400,

    // scheduled for execution 2015-01-01 00:00:00 (system timezone applies)
    $queue->push($job, array(
        'scheduled' => '2015-01-01 00:00:00'

    // scheduled for execution at 2015-01-01 01:00:00
    $queue->push($job, array(
        'scheduled' => '2015-01-01 00:00:00',
        'delay' => 3600

    // scheduled for execution at now + 300 seconds
    $queue->push($job, array(
        'delay' => 'PT300S'

    // scheduled for execution at now + 2 weeks (1209600 seconds)
    $queue->push($job, array(
        'delay' => '2 weeks'

    // scheduled for execution at now + 300 seconds
    $queue->push($job, array(
        'delay' => new DateInterval("PT300S"))

Worker actions

Interact with workers from the command line from within the public folder of your Laminas Framework 2 application, (*13)

Starting a worker

Start a worker that will keep monitoring a specific queue for jobs scheduled to be processed. This worker will continue until it has reached certain criteria (exceeds a memory limit or has processed a specified number of jobs)., (*14)

php index.php queue doctrine <queueName> --start, (*15)

A worker will exit when you press cntr-C after it has finished the current job it is working on. (PHP doesn't support signal handling on Windows), (*16)

*Warning : In previous versions of SlmQueueDoctrine the worker would quit if there where no jobs available for processing. That meant you could savely create a cronjob that would start a worker every minute. If you do that now you will quickly run out of available resources., (*17)

Now, you can let your script run indefinitely. While this was not possible in PHP versions previous to 5.3, it is now not a big deal. This has the other benefit of not needing to bootstrap the application every time, which is good for performance. *, (*18)

Recovering jobs

To recover jobs which are in the 'running' state for prolonged period of time (specified in minutes) use the following command., (*19)

php index.php queue doctrine <queueName> --recover [--executionTime=], (*20)

Note : Workers that are processing a job that is being recovered are NOT stopped., (*21)

The Versions