Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP页面中长进程的刷新输出_Php_Apache_Flush_Proc Open - Fatal编程技术网

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

PHP页面中长进程的刷新输出,php,apache,flush,proc-open,Php,Apache,Flush,Proc Open,我有一个“长”脚本,我想在PHP页面中执行,我希望它的输出在脚本输出内容后立即“刷新”。 我读过大量的解决方案,如、,但在我的案例中,没有像预期的那样工作 我的测试脚本: #!/bin/bash echo "This is a test script" echo "Sleeping" sleep 30 echo "Done" 已为www数据设置可执行权限 我的PHP页面: <?php @apache_setenv('no-gzip', 1); @ini_set('zlib.output

我有一个“长”脚本,我想在PHP页面中执行,我希望它的输出在脚本输出内容后立即“刷新”。 我读过大量的解决方案,如、,但在我的案例中,没有像预期的那样工作

我的测试脚本:

#!/bin/bash

echo "This is a test script"
echo "Sleeping"
sleep 30
echo "Done"
已为www数据设置可执行权限

我的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);
?>
我用LAMP

如果我在终端中运行PHP页面

$php test.php

它工作得很好:我立即得到“这是一个测试脚本”和“正在睡觉”,过了一会儿,“完成”

如果我在浏览器中加载页面,它将不工作:它将等待test.sh完成后再输出任何内容

已编辑:如果我在循环中添加echo str_pad(“”,4096)。“\n”则它可以工作。但是,这个修复程序表明,出于我不理解的原因,输出缓冲仍然设置为其默认值(4096),并且在我尝试配置时没有关闭

此外,这种解决方案并不完美,因为在现实中,它为输出增加了空间

我正在寻找一个解决方案

  • 刷新PHP页面的输出
  • 不修改php.ini
  • 不修改输出

谢谢

你试图达到的行为取决于许多因素。我猜你读了第页。你用的是什么浏览器?尝试在循环中的
print$s
之后添加换行符,使其成为
print$s。“\n”
,看看这是否有帮助。有一点需要注意。PHP的输出缓冲设置有两个可能的值。一个是指示它是否打开,第二个是指示缓冲区的最大大小。如果output_buffering设置为1,则在PHP代码执行完成之前,您可能无法看到内容或浏览器加载指示器旋转。这是因为将output_buffering设置为1意味着我们已经启用了它,但没有指定最大大小,因此在这种情况下,PHP缓冲区可以将数据保存到memory_limit设置中的数字。来源:@marekful不,这不会改变任何事情(老实说,我不认为它应该改变什么,因为它只是在修改显示)。@sanderbee well输出缓冲在我的情况下是关闭的。所以没有缓冲区大小。所以,这也不能解决我的问题,除非我误解了你的观点。不管服务器端缓冲还是压缩,浏览器/代理可能会采用一些缓冲策略。我在PHP的flush文档的基础上提出了这个新行,其中提到它可能会有所帮助(尽管在提到Netscape时有些过时)。另外,请查看“用户提供的注释”下的第一个条目。它声称有一个经过测试的解决方案,可以将内容逐行发送到浏览器,浏览器在发送内容时逐行显示内容。在该解决方案中,发送4K的换行符以获得所需的结果。也许你应该试一试。(
str\u-pad(“”,4096)。“\n”
zlib.output_compression = Off
output_buffering = Off
while ($s = fgets($pipes[1])) {
  print $s;
  echo str_pad('',4096)."\n";    
  flush();
}