massivescale/celery-php

2.1.2 2016-10-16 07:17 UTC

README

PHP client capable of executing Celery tasks and reading asynchronous results.

Uses AMQP extension from PECL, the PHP AMQP implementation or Redis and the following settings in Celery:

result_serializer = 'json'
result_expires = None
task_track_started = False

The required PECL-AMQP version is at least 1.0. Last version tested is 1.4.

Last PHP-amqplib version tested is 2.5.1.

Last predis version tested is 1.0.1.

Last Celery version tested is 3.1.19 (but check out the celery4 branch)

API documentation is dead, help wanted

POSTING TASKS

$c = new \Celery\Celery('localhost', 'myuser', 'mypass', 'myvhost');
$result = $c->PostTask('tasks.add', array(2,2));

// The results are serializable so you can do the following:
$_SESSION['celery_result'] = $result;
// and use this variable in an AJAX call or whatever

tip: if using RabbitMQ guest user, set "/" vhost

READING ASYNC RESULTS

while (!$result->isReady())    {
    sleep(1);
    echo '...';
}

if ($result->isSuccess()) {
    echo $result->getResult();
} else {
    echo "ERROR";
    echo $result->getTraceback();
}

GET ASYNC RESULT MESSAGE

$c = new \Celery\Celery('localhost', 'myuser', 'mypass', 'myvhost');
$message = $c->getAsyncResultMessage('tasks.add', 'taskId');

PYTHON-LIKE API

An API compatible to AsyncResult in Python is available too.

$c = new \Celery\Celery('localhost', 'myuser', 'mypass', 'myvhost');
$result = $c->PostTask('tasks.add', array(2,2));

$result->get();
if ($result->successful()) {
    echo $result->result;
}

ABOUT

Based on this blog post and reading Celery sources. Thanks to Skrat, author of Celerb for a tip about response encoding. Created for the needs of my consulting work at Massive Scale.

License is 2-clause BSD.

DEVELOPMENT

Development process and goals.

CONNECTING VIA SSL

Connecting to a RabbitMQ server that requires SSL is currently only possible via PHP-amqplib to do so you'll need to create a celery object with ssl options:

$ssl_options = [
    'cafile' => 'PATH_TO_CA_CERT_FILE',
    'verify_peer' => true,
    'passphrase' => 'LOCAL_CERT_PASSPHRASE',
    'local_cert' => 'PATH_TO_COMBINED_CLIENT_CERT_KEY',
    'CN_match' => 'CERT_COMMON_NAME'
];

$c = new \Celery\Celery($host, $user, $password, $vhost, 'celery', 'celery', 5671, false, false, $ssl_options);

CONNECTING TO REDIS

Refer to files in testscenario/ for examples of celeryconfig.py.

$c = new \Celery\Celery(
    'localhost', /* Server */
    '', /* Login */
    'test', /* Password */
    'wutka', /* vhost */
    'celery', /* exchange */
    'celery', /* binding */
    6379, /* port */
    'redis' /* connector */
);