从 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 中:
- 打开豆茎管
- 检索参数
- 做你需要的!
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
我在 PHP 中有一个函数执行一些需要异步调用另一个函数的任务。
function doTask1() {
// some task
asyncTask()
}
我做了一些研究,被告知我需要使用 beantalk 来实现相同的目标,但我对如何实现它感到困惑,因为我找不到任何文档或教程来实现相同的目标。
这是异步函数的样子
function asyncTask(){
// raise an event
console.log("event raised");
}
想法是函数 doTask1()
应该继续并完成,无论 asyncTask();
中发生什么。
我们在这里管理的方式是从 php cli 启动第二个任务。
在任务 1 中:
- 将要传递给异步函数的参数放在一个管中
- 使用异步函数调用脚本
- 继续您的任务 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>&1 : 我们不需要日志,所以将所有日志重定向到垃圾箱
- & :这个是关键:运行 这个向后和 return 提示,所以 exec() 可以完成,task1 可以继续!
还要注意,由于 task2 运行s 在后面,它不能 return 给 task1 一些东西,但它可以将响应放在另一个管中以通知其他订阅者该任务完成等!
++
Rom1deTroyes