我当前的解决方案
private function run_lengthy_job($command, $message) {
printf("%s\t", $message);
for($handle = popen($command, 'r'),
stream_set_blocking($handle, FALSE),
stream_set_timeout($handle, 3);
!feof($handle); sleep(1)) {
echo '.';
exec(sprintf('logger "%s"',
escapeshellarg(stream_get_contents($handle))));
}
$exit_status = pclose($handle);
if(pcntl_wifexited($exit_status)
&& pcntl_wexitstatus($exit_status) == 0) {
echo "done!\n";
} else {
echo "failed!\n";
}
}
调用fread时发生的长等待时间可能是因为对$handle的访问被阻塞,popen无法将输出写入它。