大量の出力を生成するPHPスクリプトをラップする必要があり、実行に約30分かかるPerlスクリプトがあります。
現時点では、次のように砲撃しています。
print `$command`;
これは、PHPスクリプトが呼び出され、その役割を果たしているという意味で機能しますが、PHPスクリプトが30分後に終了するまで、Perlによってレンダリングされる出力はありません。
PHPからの出力が受信するとすぐにperlによって出力されるようにシェルアウトする方法はありますか?
大量の出力を生成するPHPスクリプトをラップする必要があり、実行に約30分かかるPerlスクリプトがあります。
現時点では、次のように砲撃しています。
print `$command`;
これは、PHPスクリプトが呼び出され、その役割を果たしているという意味で機能しますが、PHPスクリプトが30分後に終了するまで、Perlによってレンダリングされる出力はありません。
PHPからの出力が受信するとすぐにperlによって出力されるようにシェルアウトする方法はありますか?
問題は、PHPスクリプトが終了するまでPerlが読み取りを終了せず、読み取りが終了したときにのみ書き込みが行われることです。backticksオペレーターは、子プロセスが終了するまでブロックし、読み取り/書き込みループを暗黙的に作成する魔法はありません。
だからあなたはそれを書く必要があります。パイプで開いてみてください:
open my $fh, '-|', $command or die 'Unable to open';
while (<$fh>) {
print;
}
close $fh;
これにより、PHPスクリプトが書き込むときに各行が読み取られ、すぐに出力されます。PHPスクリプトが便利な行で出力されず、個々の文字で出力したい場合はread
、ファイルハンドルからデータを取得するためにを使用することを検討し、$| = 1
それを書き込むためにstdoutの出力バッファリング()を無効にする必要があります。
http://perldoc.perl.org/perlipc.html#Using-open()-for-IPCも参照してください。
本当にやってるのprint `$command`
?
コマンドのみを実行していて、その出力をキャプチャしない場合は、単に。を使用しますsystem $command
。Perlを経由せずにstdoutに直接書き込みます。
調査することをお勧めしCapture::Tiny
ます。このようなIIRCは機能するはずです:
use strict;
use warnings;
use Capture::Tiny qw/tee/;
my ($stdout, $stderr, @result) = tee { system $command };
実は、system
YMMVを使うだけで十分かもしれません。