Warum hängt PHP nach dem Schreiben von 4096 Bytes in einen Prozess, der mit proc_open gestartet wurde?

8

Für alle, die sich wundern, nachdem sie alles für ein paar Stunden verlassen haben, funktioniert es jetzt perfekt.

Ich versuche, eine Videodatei an VLC zu übergeben, die PHP als Proof of Concept für einen bevorstehenden Projektvorschlag für jemanden verwendet.

Ich habe gezeigt, dass es funktioniert, indem ich eine Datei & lt; 4KB (Gray für 10 Sekunden) und mein Skript testen, aber ich bin neugierig auf den Grund, warum das überhaupt passiert.

Hier ist ein Beispielskript, um zu sehen, was ich meine:

%Vor%

Ich bin auf Windows 10 und benutze PHP 5.5.31. Ich habe ein paar Fehlerberichte auf der PHP-Seite über diese Art von Dingen gesehen, aber sie schlagen vor, dass die neueste Version es behoben hat. Ich verstehe die Konzepte des Blockierens eines Streams nicht ganz, aber ich habe PHP v7.0.3 bereits vergeblich versucht.

Ich führe dieses Skript über die Befehlszeile aus: php file.php

    
Mitchell O'Sullivan 28.02.2016, 13:16
quelle

1 Antwort

3

Ich habe genau das gleiche Problem mit der WAV-Umwandlung von MP3 unter Verwendung von LAME unter Windows bekommen und konnte keine funktionierende Lösung finden.

Ich habe Dutzende von Dingen ausprobiert, einschließlich blockierender / nicht blockierender Schreibvorgänge, Schreiben kleiner (& lt; 1k) Datenblöcke, Schlafen und Schreiben versuchen, aber es war nie in der Lage, alle Daten zu schreiben. Ungefähr so ​​viel, wie ich jemals schreiben konnte, bevor es scheiterte, war ungefähr 40kb (Fehler, der fwrite war, würde immer 0 zurückgeben und niemals mehr Daten in den Stream schreiben, egal wie lange ich wartete; unabhängig von der Größe der zuvor geschriebenen Stücke versuchte Sekunden zwischen Schreibvorgängen zu warten und sie würden immer zu etwa 30-40kb gelingen und niemals mehr schreiben).

Letztendlich gab ich auf und glücklicherweise konnte LAME die Eingabe von einer Datei anstelle von STDIN lesen, also entschied ich mich dafür, die Daten in eine temporäre Datei zu schreiben, LAME aufzurufen und die temporäre Datei zu entfernen.

Hier ist der relevante Code:

%Vor%     
drew010 28.02.2016, 20:38
quelle

Tags und Links