刷新PHP页面中长进程的输出

时间:2015-08-28 09:51:23

标签: php apache flush proc-open

我想在PHP页面中执行一个“长”脚本,并且我希望在脚本输出内容后立即“刷新”它的输出。 我已经阅读了很多解决方案,例如questions 470652591820948882383PHP 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();
}

此外,这种解决方案并不完美,因为实际上它会为输出增加空间。

我正在寻找

的解决方案
  • 刷新PHP页面的输出
  • 不会修改php.ini
  • 不会修改输出

谢谢!

0 个答案:

没有答案