Skript wird nach der Befehlszeile nicht fortgesetzt

8

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

pdf

Ссылка

code

%Vor%

Klasse

%Vor%

Fehler

%Vor%     
clarkk 26.02.2017, 11:26
quelle

3 Antworten

7

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%     
Bradley 07.03.2017 06:44
quelle
1

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.)

    
Wieger 11.03.2017 15:22
quelle
0

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:

%Vor%

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.

    
Constantin Galbenu 12.03.2017 18:10
quelle

Tags und Links