从 beantalk 调用函数

Calling a function from beanstalk

我在 PHP 中有一个函数执行一些需要异步调用另一个函数的任务。

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

我做了一些研究,被告知我需要使用 beantalk 来实现相同的目标,但我对如何实现它感到困惑,因为我找不到任何文档或教程来实现相同的目标。

这是异步函数的样子

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

想法是函数 doTask1() 应该继续并完成,无论 asyncTask(); 中发生什么。

我们在这里管理的方式是从 php cli 启动第二个任务。

在任务 1 中:

  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>&1 : 我们不需要日志,所以将所有日志重定向到垃圾箱
  • & :这个是关键:运行 这个向后和 return 提示,所以 exec() 可以完成,task1 可以继续!

还要注意,由于 task2 运行s 在后面,它不能 return 给 task1 一些东西,但它可以将响应放在另一个管中以通知其他订阅者该任务完成等!

++

Rom1deTroyes