2017-12-05 13 views
0

Ubuntuベースのサーバでpdftoppmユーティリティを使用してバッチPDFからJPEGへの会話を行うためにexec()を使用しようとしています。 PHPスクリプトconverter.phpの主要部分は、次のとおりです。奇妙な動作でexec()がランダムに失敗する

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

今、例えば2つのファイルを取る:

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

これらのファイルは、ディスク上の既存の場所に存在します。 親フォルダ(A/ & B/)所有者と権限は以下のとおりです。

UID:WWWのデータ、GID:WWW-データ、パーミッション:755

ファイル(両方source_file.pdf)所有者そして、権限は以下のとおりです。

UID:WWWのデータ、GID:WWW-データ、パーミッション:644

スクリプトのインスタンスが1つだけ実行されているときにコードが動作し、問題なく出力を生成します。たとえば、$PDF_source = './A/source_file.pdf'となります。すべてのページがJPEGファイルに変換されます。

しかし、スクリプトの2番目のインスタンスは、EXEC()関数は一つだけそれらの上で動作し、他の一つに、それが終了ステータス1で、次のエラーを生成し実行します:

他の言葉で
I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory. 

、1のファイルはJPEGに変換され、もう一方のファイルはすでに終了していますが、出力時にエラーが発生します。 ファイルへのすべてのパスが正しく、ファイルが存在することに注意してください。

はまた、スクリプトはcronジョブで次のコマンドをCLIから実行されている(ただし、あまりにも標準のWeb要求から実行される可能性があります)のでご注意:

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

私は複数のインスタンスを実行している防ぐためにしようとしましたスクリプトの先頭に次のコードが含まれています。

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(); 

問題は何ですか?どうすれば問題を解決できますか?

答えて

0

入力の前にちょうど__DIR__.'/'.を追加しました。

しかし、私はまだスクリプトの最初の実行でディレクトリを追加する前に、なぜそれが動作していたのかを知りたいですか?