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();
問題は何ですか?どうすれば問題を解決できますか?