2017-12-05 6 views
0

Ich versuche exec() zu verwenden, um eine Batch-PDF zu JPEG-Konversation mit pdftoppm Dienstprogramm auf einem Ubuntu-basierten Server zu tun. Der Hauptteil der PHP-Skript converter.php ist:exec() schlägt nach dem Zufallsprinzip mit merkwürdigem Verhalten

for ($i = 1; $i <= $PDF_pageCount; $i++){ 
    exec("pdftoppm -jpeg -f $i -l $i '$PDF_source' '$PNG_output' 2>&1", $Output, $Status); 
    sleep(1); // To simulate delay and let the other instance to run while this one is inside the loop. 
} 

nun zwei Dateien zum Beispiel nehmen:

  • ./A/source_file.pdf
  • ./B/source_file.pdf

Diese Dateien sind an ihrem Platz auf der Festplatte vorhanden. Die übergeordneten Ordner (A/ & B/) Eigentümer und Berechtigungen sind:

UID: www-data, GID: www-data, Permission: 755

Die Dateien (beide source_file.pdf) Eigentümer und Berechtigungen sind:

UID: www-data, GID: www-data, Permission: 644

Dort funktioniert Code-Datei, wenn nur eine Instanz des Skripts ausgeführt wird und die Ausgaben ohne Probleme generiert. Zum Beispiel mit $PDF_source = './A/source_file.pdf'. Alle Seiten werden erfolgreich in JPEG-Dateien konvertiert.

Aber wenn die zweite Instanz von Skript ausgeführt wird, arbeitet exec() Funktion auf nur einer von ihnen und in anderen, erzeugt es den folgenden Fehler mit Exit-Status 1:

I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory. 

Mit anderen Worten, ein Die Dateien werden in JPEG konvertiert und die andere Datei (obwohl die erste Datei möglicherweise bereits beendet wurde) erzeugt den Fehler bei der Ausgabe. Beachten Sie, dass alle Pfade zu Dateien korrekt sind und Dateien existieren.

Beachten Sie auch, dass das Skript mit dem folgenden Befehl von CLI läuft in einem cronjob wird (aber vielleicht von einer Standard-Web-Anfrage zu ausgeführt werden):

/path/to/php -q /path/to/converter.php 

Ich habe versucht, mehr als eine Instanz zu verhindern laufe der Datei in einer Zeit mit dem folgenden Code am Anfang des Skripts:

class Lock{ 
    private $fp; 
    function __construct(){ 
     $this->fp=fopen(__FILE__,'r'); 
     if (!flock($this->fp,LOCK_EX|LOCK_NB)) { 
      die('ARN'.PHP_EOL); 
     } 
    } 
    function __destruct(){ 
     flock($this->fp,LOCK_UN); 
     fclose($this->fp); 
    } 
} 

$lock=new Lock(); 

Was ist das Problem genau? Wie kann ich das Problem lösen?

Antwort

0

Nun, ich habe gerade hinzugefügt __DIR__.'/'. vor Eingaben und es funktioniert jetzt.

Aber ich möchte immer noch herausfinden, warum es funktionierte, bevor Sie das Verzeichnis in der ersten Ausführung des Skripts hinzufügen?

Verwandte Themen