Вызов функции из beanstalk - PullRequest
       41

Вызов функции из beanstalk

0 голосов
/ 25 февраля 2019

У меня есть функция в PHP, которая выполняет некоторую задачу, которая должна вызывать другую функцию асинхронно.

function doTask1() {
    // some task
    asyncTask()
}

Я провел какое-то исследование и мне сказали, что мне нужно использовать beanstalk для достижения того же, но я не совсем понимаю, как этого добиться, так как я не могу найти какую-либо документацию или учебные пособия для этого.так же.

вот как выглядит асинхронная функция

function asyncTask(){
// raise an event
console.log("event raised");
}

Идея состоит в том, что функция doTask1() должна выполняться и завершаться независимо от того, что происходит в asyncTask();.

1 Ответ

0 голосов
/ 27 мая 2019

Как мы управляем здесь, так это запустить вторую задачу из php cli.

В Задаче 1:

  1. Поместите параметры, которые вы хотите передать, в асинхронную функцию втрубка
  2. вызов сценария с вашей асинхронной функцией
  3. Продолжение вашей задачи1 ...

В задаче 2:

  1. Открыть Beanstalkтрубка
  2. извлеките параметры
  3. делайте что нужно!
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
...