2009-07-28 5 views
4

Ich Berufung auf die proc_open() und ich kann nicht den Ausgang des Prozesses zum stderr erfassen:Capture-stderr Ausgabe von einem proc_open() auf Windows

$curFolder = getcwd(); 
$procDescriptor = array(2 => array("pipe", "w")); 
$cmd = "MyApp.exe -f optimization.csv"; 
$process = proc_open($cmd, $procDescriptor, $pipes, $curFolder); 

if(is_resource($process) == true) 
{ 
    $procStatus = proc_get_status($process); 

    while($procStatus['running'] === true) 
    { 
    if(!feof($pipes[2])) 
    { 
     $logLine = fgets($pipes[2]); 
     echo("Read >${logLine}<"); 
    } 
    sleep(1); 
    } 
} 

Das Programm auf dem fgets hängt(). Wenn ich das Programm über die Befehlszeile ausführe, funktioniert alles, d. H. Es wird etwas in den stderr geschrieben (und ich habe auch versucht, das stdout mit dem gleichen Ergebnis zu verwenden). Ich führe das Skript unter Windows aus - das gleiche Skript unter Linux läuft reibungslos.

Antwort

1

Von der proc_open()docs:

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
    1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
    2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 
); 

$cwd = '/tmp'; 
$env = array('some_option' => 'aeiou'); 

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 

if (is_resource($process)) { 
    // $pipes now looks like this: 
    // 0 => writeable handle connected to child stdin 
    // 1 => readable handle connected to child stdout 
    // Any error output will be appended to /tmp/error-output.txt 

    fwrite($pipes[0], '<?php print_r($_ENV); ?>'); 
    fclose($pipes[0]); 

    echo stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 

    // It is important that you close any pipes before calling 
    // proc_close in order to avoid a deadlock 
    $return_value = proc_close($process); 

    echo "command returned $return_value\n"; 
} 
?> 

Vielleicht ist Ihr Prozess nicht in stderr meldet, wenn Sie es leer

+0

Wie ich oben schrieb, schreibt mein Prozess definitiv etwas in die Ausgabe und ich versuchte beide, die $ pipes [1] und die $ pipes [2] ohne Ergebnis zu erfassen. –

0

finden würde ich empfehlen, auch Ströme stdin und stdout hinzufügen, auch wenn Sie don‘ t konsumiere die Daten; Einige C-Bibliotheken geraten in einen schwindelerregenden Zustand, wenn die Datenströme nicht vorhanden sind, und können entweder früher (glibc) oder potenziell keil (einige Versionen von MS libc) beenden.

5

Sie haben eine Endlosschleife.

$ procStatus ['running'] wird sich nur ändern, wenn Sie den Aufruf an proc_get_status() innerhalb der Schleife setzen. PHP hat keine dynamischen Eigenschaften wie JavaScript.

Ich habe die Linie

$procStatus = proc_get_status($process); 

direkt nach dem sleep() und es funktioniert gut.

+0

Während ich denke, dass er eine Endlosschleife hat, gibt es auch ein Problem mit den Fgets – SeanDowney

Verwandte Themen