Ich habe ein Problem mit einem Skript mit einer Befehlszeile .. Das PHP-Skript nie weiter ..
Habe versucht, die Befehlszeile direkt über putty aufzurufen, und es gibt viele Fehler aus, aber es wird sofort zurückgegeben / vervollständigt. Warum kehrt es dann nicht zurück zu PHP?
Es funktioniert gut mit anderen PDF-Dateien, aber nicht diesem
Das PDF ist problematisch - @dwarring hat dies bereits in den Kommentaren vermieden (hier zitiert, um den Kommentator zu bewerten)
@dwarring sagte: "Ich bin mir ziemlich sicher, dass dieses PDF im Sterben liegt, weil der Content-Stream ein Inline-Image enthält, gefolgt von" BI ", gefolgt von Zufallsdaten und" EI " Ein Tag, an dem sie diese Operatoren entwarfen, das Problem ist, dass Situationen entstehen, in denen die binären Daten zufällig "EI" enthalten und die PDF-Datei nicht mehr anordnen können. Einige Tools können das besser handhaben, aber im Idealfall sollte der Hersteller dieses Images vermeiden Inline-Bilder. "
Auf der PHP-Seite der Dinge verwenden Sie statt einer if-Anweisung einen try / catch-Block, und Sie sollten die Kontrolle über das Skript behalten.
%Vor% Sie könnten stream_select
in Verbindung mit feof
verwenden, um zu prüfen, für welchen der beiden Lesestreams Daten verfügbar sind, wie der folgende Code.
Ich habe es getestet (mit PHP 7) und es blockiert hier nicht (mit den vorgenommenen Änderungen).
%Vor% Die Funktionen stream_select
und feof
werden aufgrund des folgenden benötigt (zitiert aus Ссылка ):
Die im Lese-Array aufgelisteten Streams werden überwacht, um zu sehen, ob Zeichen zum Lesen verfügbar sind (genauer gesagt, ob ein Lesevorgang nicht blockiert wird - insbesondere ist eine Stream-Ressource auch am Dateiende bereit, In diesem Fall gibt ein fread () eine Nulllänge zurück.)
Das Problem ist, dass dieses Programm /var/bin/poppler-0.51.0/utils/pdfimages
nichts in stdout
schreibt und Ihr Code hängt bei $this->output = stream_get_contents($this->pipes[1]);
, daher ist Ihre Klasse nicht gut für dieses Programm. Bei Programmen, die nichts in stdout
schreiben, dürfen Sie nicht von $this->pipes[1]
lesen. Sie sollten eine andere Klasse haben, die für diesen speziellen Anwendungstyp verwendet wird:
Dieser Code gibt Folgendes aus:
%Vor% UPDATE:
Eine andere Lösung besteht darin, stream_set_blocking($this->pipes[1], 0);
unmittelbar nach dem Aufruf an proc_open
aufzurufen, damit der Code nicht auf eine Ausgabe wartet.
Tags und Links php command-line pdf poppler