0

2 つの短いスクリプトがあります。最初の awk スクリプトは、大きなファイルを処理し、名前付きパイプ 'myfifo.dat' に出力します。2 番目の Perl スクリプトは、LOAD DATA LOCAL INFILE 'myfifo.dat'...コマンドを実行します。これらのスクリプトは両方とも、次のようにローカルで実行すると機能します。

lee.awk big.file &
lee.pl

ただし、これらのスクリプトを PHP Web ページから呼び出すと、名前付きパイプがブロックされます。

$awk="/path/to/lee.awk {$_FILES['uploadfile']['tmp_name']} &";
$sql="/path/to/lee.pl";

if(!exec($awk,$return,$err)) throw new ZException(print_r($err,true)); //blocks here
if(!exec($sql,$return,$err)) throw new ZException(print_r($err,true));

awk および Perl スクリプトを変更して、通常のファイルへの書き込みと読み取りを行うと、PHP からすべてが正常に機能します。fifo と通常のファイルのパーミッションは 666 です (テスト用)。これらの操作は、名前付きパイプを介してはるかに高速に実行されるため、名前付きパイプを使用することをお勧めします。ブロックを解除する方法はありますか?

ps。なぜ私がこのすべての悪化に行くのか疑問に思っている場合は、この SO の質問を参照してください。

4

1 に答える 1

1

おそらくご存じのとおり、名前付きパイプを書き込み用に開くと、他の誰かが読み取り用に開くまでブロックされます。これが、最初の exec() 呼び出しのコマンドラインの最後に「&」がある理由だと思います。

しかし、PHP はその構文を尊重しますか? 私は PHP の専門家ではありませんが、子の実行が完了する前に PHP exec() を返す正しい方法でない場合、2 つの exec() 呼び出しがシリアル化され、このブロック動作が完全に説明されます。

于 2010-03-30T11:23:34.420 に答える