2016-05-31 6 views
3

Kann jemand sagen, warum der folgende Code auf fwrite($pipes[0], $data); hängt, aber es hängt nicht, wenn ich $bytesCount auf zum Beispiel 1000 ändern?php -> fwrite zu verarbeiten Rohr hängt -> warum?

war ich nicht in der Lage Antwort via google :(Sie
Vielen zu finden.

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w") 
); 

$bytesCount = 1000000; 
$process = proc_open('cat', $descriptorspec, $pipes); 
$data = str_repeat('a', $bytesCount); 
fwrite($pipes[0], $data); 
fclose($pipes[0]); 
$response = stream_get_contents($pipes[1]); 
fclose($pipes[1]); 
$return_value = proc_close($process); 
+0

Funktioniert es, wenn Sie 'fwrite' mit dem dritten Argument verwenden und dann den Stream' fflush', wiederholen Sie dies einige Male? –

+0

@ AurelBílý nein es nicht) –

Antwort

3

Rohre sind mit Eingangs- und Ausgangspuffer implementiert. cat beginnt zu lesen, und kopiert alles auf den Ausgang. Wenn der Ausgangspuffer voll ist, seine Schreib blockiert.

da nichts cat ‚s Eingang liest (wie die Linie nie erreicht), wird es auf unbestimmte Zeit sperren, blockiert Ihre fwrite.

+0

Ja, Sie haben Recht, danke. Wenn ich Daten von Prozess stdout nach jedem Schreiben zu Stdin lesen - funktioniert alles wie erwartet. –