从Beanstalk调用功能



i在PHP中具有某些任务,需要使其他功能异步调用另一个函数。

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

我进行了一些研究,并被告知我需要使用beanstalk来实现同样的事情,但是我对如何实现它感到困惑,因为我找不到任何文档或教程来做同样的事情。

异步功能的外观

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

这个想法是函数doTask1()应该继续前进并完成,无论asyncTask();中发生的任何事情。

我们在这里管理此操作的方式是从PHP CLI启动第二个任务。

task1:

  1. 将您要传递到管中的异步函数的参数
  2. 用您的异步函数调用脚本
  3. 继续您的任务1 ...

在任务2:

  1. 开放式豆茎管
  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:在新会话中(独立的环境)
  • php:几乎可以是您想要的任何可执行二进制的!
  • /var/www/asynctask.php:带有第二个功能的文件
  • /dev/null 2>&amp; 1:我们不需要日志,所以将所有内容重定向到垃圾
  • &amp;:这是关键:向后运行并返回提示

还请注意,当Task2向后运行时,它不能将某些内容返回到任务1,但是它可以将响应放在另一个管中,以通知其他订户,该任务已完成等。!

Rom1deTroyes

相关内容

  • 没有找到相关文章

最新更新