PHP выполняет процесс в фоновом режиме и получает результаты

Я ищу простой способ запустить процесс (через php) в фоновом режиме (я не хочу, чтобы мой скрипт php ожидал завершения). Хотя мне нужно было бы также иметь указатель на процесс в другом, чтобы отследить конец его выполнения, чтобы выполнить некоторую последующую работу.

Пока что я менеджер, чтобы начать процесс с чем-то вроде

pclose ( popen ( "\"start /B " . $commands . " > log.txt\"", "r" ) );

Но я не уверен, как узнать, завершен ли процесс (и может быть, это слишком рано утром, но я не могу найти много об этом, используя popen и start / B)

Я использую способ «запуска», потому что в идеале решение должно работать как на Windows, так и на Linux.

Любой вклад будет оценен.
Спасибо за помощь!

0

Решение

Мне пришлось выполнить аналогичную задачу, и хотя у меня был немного другой подход, он довольно похож на то, что вы пытаетесь сделать, и я прошел через сокеты:

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>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]