i在PHP中具有某些任务,需要使其他功能异步调用另一个函数。
function doTask1() {
// some task
asyncTask()
}
我进行了一些研究,并被告知我需要使用beanstalk来实现同样的事情,但是我对如何实现它感到困惑,因为我找不到任何文档或教程来做同样的事情。
异步功能的外观
function asyncTask(){
// raise an event
console.log("event raised");
}
这个想法是函数doTask1()
应该继续前进并完成,无论asyncTask();
中发生的任何事情。
我们在这里管理此操作的方式是从PHP CLI启动第二个任务。
task1:
- 将您要传递到管中的异步函数的参数
- 用您的异步函数调用脚本
- 继续您的任务1 ...
在任务2:
- 开放式豆茎管
- 检索参数
- 做您需要的!
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