pop-queue¶
The popphp/pop-queue is a job queue component that provides the ability to pass an executable job off to a queue to be worked at a later date. Queues can either process jobs via sequential workers or schedulers. The available storage adapters for the queue component are:
- Database
- Redis
- File
And others can be written as needed, implementing the AdapterInterface
and extending the AbstractAdapter
.
Installation¶
Install it directly into your project:
composer require popphp/pop-queue
Or, include it in your composer.json file:
{
"require": {
"popphp/pop-queue": "^1.2.1"
}
}
Basic Use¶
Pushing a Job onto a Queue
use Pop\Db\Db;
use Pop\Queue;
use Pop\Queue\Processor;
use Pop\Queue\Processor\Jobs\Job;
$db = Db::mysqlConnect([
'database' => 'popdb',
'username' => 'popuser',
'password' => '12pop34'
]);
$queue = new Queue\Queue('pop-queue', new Queue\Adapter\Db($db));
$job1 = new Job(function() {
echo 'This is job #1' . PHP_EOL;
});
$worker = new Processor\Worker();
$worker->addJob($job1);
$queue->addWorker($worker);
$queue->pushAll(); // Pushes the worker and its jobs onto the queue to be processed later
Loading a Queue and Processing the Jobs
use Pop\Db\Db;
use Pop\Queue;
use Pop\Queue\Processor;
use Pop\Queue\Processor\Jobs\Job;
$db = Db::mysqlConnect([
'database' => 'popdb',
'username' => 'popuser',
'password' => '12pop34'
]);
$queue = Queue\Queue::load('pop-queue', new Queue\Adapter\Db($db));
$queue->processAll(); // Processes the jobs on the queue stack
Scheduling a Job
use Pop\Db\Db;
use Pop\Queue;
use Pop\Queue\Processor;
use Pop\Queue\Processor\Jobs\Job;
$db = Db::mysqlConnect([
'database' => 'popdb',
'username' => 'popuser',
'password' => '12pop34'
]);
$queue = new Queue\Queue('pop-queue', new Queue\Adapter\Db($db));
$job1 = new Job(function() {
echo 'This is job #1' . PHP_EOL;
});
$scheduler = new Processor\Scheduler();
$scheduler->addJob($job1)
->every5Minute(); // This job will run every 5 minutes
$queue->addScheduler($scheduler);
$queue->pushAll();
Using an Application Command
Presuming you have an application that has a route define like below:
$app = new Pop\Application([
'routes' => [
'foo bar' => [
'controller' => 'ConsoleController',
'action' => 'foo'
]
]
]);
Where the CLI application command to run that would be:
$ ./app foo bar
You can pass an application command to a queue to run a later or scheduled time:
use Pop\Queue\Processor;
use Pop\Queue\Processor\Jobs\Job;
$appJob = Job::command('foo bar');
$scheduler = new Processor\Scheduler();
$scheduler->addJob($appJob)
->every10Minutes(); // This will trigger the application command every 10 minutes
Executing a System Command
*WARNING: Take caution in running and executing system commands from a PHP application*
You can pass a system command to be executed later, assuming the system is *safely* configured to allow that to happen:
use Pop\Queue\Processor;
use Pop\Queue\Processor\Jobs\Job;
$sysJob = Job::exec('ls -la');
$worker = new Processor\Worker();
$worker->addJob($sysJob);
Managing Queue
If you have a CLI application that is aware of your queues and has access to them, you can use that application to be the “manager” of your queues, checking them and processing them as needed. Assuming you have a CLI application that processes the queue via a command like:
$ ./app manage queue
You could set up a cron job to trigger this application every minute:
* * * * * cd /path/to/your/project && ./app manage queue
Or, if you’d like any output to be routed to /dev/null:
* * * * * cd /path/to/your/project && ./app manage queue >> /dev/null 2>&1