Как мы управляем здесь, так это запустить вторую задачу из php cli.
В Задаче 1:
- Поместите параметры, которые вы хотите передать, в асинхронную функцию втрубка
- вызов сценария с вашей асинхронной функцией
- Продолжение вашей задачи1 ...
В задаче 2:
- Открыть Beanstalkтрубка
- извлеките параметры
- делайте что нужно!
function doTask1() {
// some task
// 1. Open the tube (here in a Phalcon framework app) and fill the params
$queue = $this->di->getShared("queue", ["tube" => "myAsyncTube"]);
$idQueue = $queue->put([
"myparam1" => $this->param1,
"myparam2" => $this->param2
],[
"priority" => 250,
"delay" => 10,
"ttr" => 3600
]);
// 2. Call the async task (man bash !)
exec('bash -c "exec nohup setsid php -q /var/www/asyncTask.php /dev/null 2>&1 &"');
// finish some tasks
}
И в asyncTask.php:
<?php
// 1. Get the tube
$queue = $this->di->getShared("queue", ["tube" => "myAsyncTube"]);
// 2. Execute all the queued tasks of the tube
While($job = $queue->peekReady() !== false){
$job = $queue->reserve();
$message = $job->getBody();
$this->param1 = $message['param1'];
$this->param2 = $message['param2'];
// Do all the time consuming job you want !
}
Примечания к параметрам bash:
- nohup: отсоединить задание от сеанса (так что это будет продолжаться)
- setsid: в новом сеансе (отдельный env)
- php: может быть практически любой исполняемый файл, который вы хотите!
- / var / www / asyncTask.php: файл с вашей второй функцией
- / dev / null 2> & 1: нам не нужны журналы, поэтому перенаправьте все в корзину
- &: это ключ: запустите этотназад и вернитесь к подсказке, чтобы exec () мог завершиться, а задача1 могла продолжаться!
Обратите внимание также, что, поскольку задача 2 работает в обратном направлении, она не может вернуть что-то в задачу1, ноон может поместить ответ в другой трубе, чтобы уведомить других подписчиков, что задача выполнена и т. д.!
++
Rom1deTroyes