我有一個Perl腳本,它必須包裝一個PHP腳本,產生大量輸出,並且需要大約半小時才能運行。Perl - 從外部進程直接輸出到標準輸出(避免緩衝)
在那一刻,我脫殼而出有:
print `$command`;
這個作品在這個意義上,PHP腳本調用,它確實它的工作,但是,沒有被Perl渲染,直到PHP輸出腳本在半小時後完成。
有沒有一種方法可以解決這個問題,以便在PHP收到輸出後立即通過perl輸出?
我有一個Perl腳本,它必須包裝一個PHP腳本,產生大量輸出,並且需要大約半小時才能運行。Perl - 從外部進程直接輸出到標準輸出(避免緩衝)
在那一刻,我脫殼而出有:
print `$command`;
這個作品在這個意義上,PHP腳本調用,它確實它的工作,但是,沒有被Perl渲染,直到PHP輸出腳本在半小時後完成。
有沒有一種方法可以解決這個問題,以便在PHP收到輸出後立即通過perl輸出?
你真的在做print `$command`
?
如果您只運行一個命令並且沒有捕獲它的任何輸出,只需使用system $command
即可。它將直接寫入stdout而不通過Perl。
問題是,Perl不會完成閱讀,直到PHP腳本終止,並且只有當它完成閱讀後纔會寫入。反引號操作符會阻塞,直到子進程退出,並且沒有任何魔術可以隱式地進行讀/寫循環。
所以你需要寫一個。嘗試管道打開:
open my $fh, '-|', $command or die 'Unable to open';
while (<$fh>) {
print;
}
close $fh;
然後,這應該讀取每一行,如PHP腳本寫入它,並立即輸出它。如果PHP腳本沒有以方便的方式輸出,並且想要使用單個字符輸出,則需要使用read
從文件句柄中獲取數據,並禁用stdout上的輸出緩衝($| = 1
)以編寫它。
見你可能想調查Capture::Tiny
。 IIRC這樣的事情應該工作:
use strict;
use warnings;
use Capture::Tiny qw/tee/;
my ($stdout, $stderr, @result) = tee { system $command };
其實,只是用system
可能不夠好,因人而異。
是的,我確實正在做我說我在做我的問題是的,是的,這是一個明智的做法。感謝這個解決方案 - 非常簡單,它完美的工作! – 2012-07-13 12:04:16