2016-10-31 3 views
0

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

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

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

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

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

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

+0

Я не уверен, что вы хотите сделать именно, асинхронный? Я думаю, вы должны взглянуть на потоки, чтобы выполнять задачи параллельно. – Fky

ответ

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"); 

второй шаг: файл демона

daemon.php должен открыть сокет, который проверяет через определенные интервалы, если пр ocess с данным 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> 
+0

Хорошее решение, спасибо за ваше время! Я думаю, что я буду использовать систему очередности Laravel, которая позволит мне легко управлять своими задачами и заботиться о деамонах и обо всем. В любом случае, мне не нужен немедленный результат в передней части, чтобы это произошло. Но еще раз спасибо за то, что вы делитесь своим подходом – Ours