A simple Redis-based job queue for WordPress.
Install and activate this repo as a WP plugin. In a terminal, run the following:
wp queue process --delay=100
Note: You don't actually need the --delay=100
option. That's just to keep your fan from whirring too much when running this locally. :) Run wp queue process --help
for more info.
Elsewhere, in your code, push a job onto it. A job can be any serializeable callable.
/* functions.php ...or wherever */
use WpRedisJobQueue as Q;
// imagine we need to sync user account info from an external system
function sync_user_account($id) {
$externalId = get_user_meta($id, 'account_id', true);
$info = expensive_api_call(['account_id' => $externalId]);
update_user_meta($id, 'account_info', $info);
}
// sync on every successful login
add_action('wp_login', function($login, WP_User $user) {
// don't make the user wait, fetch their account info asynchronously!
Q\push([
// callback is required
'callback' => 'sync_user_account',
// args are required for any callback that takes one or more params
'args' => [$user->ID],
// you can define any other arbitrary parameters here, too:
'additional_info' => [
'ipv4_address' => $_SERVER['REMOTE_ADDR'],
'shot_first' => 'Han',
],
'initiated_by' => 'wp_login',
]);
});
The WpRedisJobQueue
namespace exposes a single function: push()
. It takes an associative $job
array as its sole argument.
TODO
The Job Queue is implemented as a long-running WP-CLI command:
wp queue process --delay=1000 --debug
...
Debug: no tasks on the queue (445.908s)
Debug: no tasks on the queue (446.909s)
Debug: no tasks on the queue (447.909s)
...
The command runs an infinite loop, polling for jobs on a (FIFO) Redis queue. It pops any jobs it finds off the queue one a time, running each one, and then resuming the loop.
A job is just an array with a callable
index and optional args
. You can push an array with any serializeable callable onto the queue from your code (note that anonymous functions/closures are not serializeable, and cannot be pushed onto the queue as callbacks).
There is no CLI interface for pushing arbitrary tasks onto the queue. That is your code's job.
NOTE: To ensure reliability, use a monitoring tool to catch failures when the WP-CLI process