我想在PHP页面中执行一个“长”脚本,并且我希望在脚本输出内容后立即“刷新”它的输出。 我已经阅读了很多解决方案,例如questions 4706525,9182094,8882383,PHP Flush Manual但是不在我的情况下正常工作!
我的测试脚本:
#!/bin/bash
echo "This is a test script"
echo "Sleeping"
sleep 30
echo "Done"
为www-data设置了可执行权限。
我的PHP页面:
<?php
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
@ini_set('output_buffering', 0);
@apache_setenv('output_buffering', 0);
echo "Here<br>";
flush();
$cmd = "../test.sh";
$pipes = array();
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);
echo "Starting process<br>";
flush();
$process = proc_open($cmd, $descriptors, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
} else {
print "Cannot create process\n";
}
echo "</pre>";
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
?>
NB。我的测试脚本test.sh位于PHP页面上方的目录中,因此是../test.sh。这不会改变任何事情。但这不是一个错字。
我的 php.ini 有那些(虽然我不太热衷于更改服务器范围,但我想测试是否存在问题):
zlib.output_compression = Off
output_buffering = Off
我使用LAMPP。
如果我在终端中运行PHP页面,
$ php test.php
它工作正常:我立刻得到“这是一个测试脚本”和“睡觉”,过了一会儿,“完成”。
如果我在浏览器中加载页面,则不工作:等到test.sh完成后再输出任何内容。
已编辑:如果我在循环中添加echo str_pad('',4096)。“\ n”,那么它可以正常工作。但是,此修复建议由于我不理解的原因,输出缓冲仍设置为其默认值(4096),并且在我尝试配置时没有关闭。
while ($s = fgets($pipes[1])) {
print $s;
echo str_pad('',4096)."\n";
flush();
}
此外,这种解决方案并不完美,因为实际上它会为输出增加空间。
我正在寻找
的解决方案谢谢!