我不得不執行類似的任務,但我有一個稍微不同的方法,非常類似於你正在嘗試做的,我通過socket去:
第一步:獲取進程PID並調用套接字文件
//windows
$desc = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
);
$p = proc_open($command, $desc, $pipes);
$status = proc_get_status($p);
$ppid = $status["pid"];
$output = array_filter(explode(" ", shell_exec("wmic process get parentprocessid,processid | find \"$ppid\"")));
array_pop($output);
$pid = end($output);
//unix
$pid = trim(shell_exec(sprintf('%s > %s 2>&1 & echo $!', $command, $outputFile)))
//Call the daemon with the socket stuff and pass the pid
shell_exec("path/to/daemon.php $pid");
第2步:守護程序文件
的daemon.php應該打開,在如果PR間隔檢查一個Socket給定的PID仍然在運行,如果沒有,發送消息並退出過程。我沒有發佈套接字的東西,因爲我認爲有很好的庫,而我的方法是手工製作的,所以很難理解。
3:在需要的地方
過程套接字消息也許你想這樣做,在javascript
<script language="javascript" type="text/javascript">
$(document).ready(function(){
var wsUri = "ws://host:port/daemon.php";
websocket = new WebSocket(wsUri);
websocket.onopen = function(ev) {
}
websocket.onmessage = function(ev) {
var msg = JSON.parse(ev.data);
switch(msg.action){
case "process_finisihed":{
//doThingsHere
}
break;
}
};
websocket.onerror = function(ev){ console.debug(ev); };
websocket.onclose = function(ev){};
});
</script>
我不知道你想做的事完全是,異步是什麼? 我想你應該看看線程並行執行任務。 – Fky