2

大量の出力を生成するPHPスクリプトをラップする必要があり、実行に約30分かかるPerlスクリプトがあります。

現時点では、次のように砲撃しています。

print `$command`;

これは、PHPスクリプトが呼び出され、その役割を果たしているという意味で機能しますが、PHPスクリプトが30分後に終了するまで、Perlによってレンダリングされる出力はありません。

PHPからの出力が受信するとすぐにperlによって出力されるようにシェルアウトする方法はありますか?

4

3 に答える 3

8

問題は、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も参照してください。

于 2012-07-12T16:17:05.840 に答える
2

本当にやってるのprint `$command`

コマンドのみを実行していて、その出力をキャプチャしない場合は、単に。を使用しますsystem $command。Perlを経由せずにstdoutに直接書き込みます。

于 2012-07-12T22:00:17.880 に答える
0

調査することをお勧めしCapture::Tinyます。このようなIIRCは機能するはずです:

use strict;
use warnings;

use Capture::Tiny qw/tee/;

my ($stdout, $stderr, @result) = tee { system $command };

実は、systemYMMVを使うだけで十分かもしれません。

于 2012-07-12T16:22:05.113 に答える