Я ищу простой способ запустить процесс (через php) в фоновом режиме (я не хочу, чтобы мой скрипт php ожидал завершения). Хотя мне нужно было бы также иметь указатель на процесс в другом, чтобы отследить конец его выполнения, чтобы выполнить некоторую последующую работу.
Пока что я менеджер, чтобы начать процесс с чем-то вроде
pclose ( popen ( "\"start /B " . $commands . " > log.txt\"", "r" ) );
Но я не уверен, как узнать, завершен ли процесс (и может быть, это слишком рано утром, но я не могу найти много об этом, используя popen и start / B)
Я использую способ «запуска», потому что в идеале решение должно работать как на Windows, так и на Linux.
Любой вклад будет оценен.
Спасибо за помощь!
Мне пришлось выполнить аналогичную задачу, и хотя у меня был немного другой подход, он довольно похож на то, что вы пытаетесь сделать, и я прошел через сокеты:
1-й шаг: получить 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 должен открыть 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>
Других решений пока нет …