我在PHP中有一个函数,该函数执行一些需要异步调用另一个函数的任务。
public abstract class Pointerable { }
public class Dog extends Pointerable {
public void bark() {
System.out.println("Bark ...");
}
}
public class Pointer extends Pointerable {
private Object myObj;
public <T extends Pointerable> void ref(T myObject) {
this.myObj = myObject;
}
public <T extends Pointerable> T deref(Class<T> myClazz) {
try {
return myClazz.cast(myObj);
} catch(ClassCastException e) {
return null;
}
}
}
我做了一些研究,并被告知我需要使用beantalk来实现这一目标,但是我对如何实现它感到困惑,因为我找不到任何文档或教程来做到这一点。
这是异步函数的外观
function doTask1() {
// some task
asyncTask()
}
想法是function asyncTask(){
// raise an event
console.log("event raised");
}
中的功能doTask1()
应该继续执行并完成。
答案 0 :(得分:0)
我们在此进行管理的方法是从php cli启动第二个任务。
在任务1中:
在Task2中:
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参数的说明:
还请注意,由于task2向后运行,它无法将任何内容返回给task1,但可以将响应放入另一个管中,以通知其他订阅者该任务已完成,等等!!
++
Rom1deTroyes