3

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

注意。我的测试脚本 test.sh 位于 PHP 页面上方的目录中,即 ../test.sh。并不是说这会改变任何事情。但这不是错字。

我的php.ini有这些(虽然,我不太热衷于更改服务器范围,但我想测试这是否是问题):

zlib.output_compression = Off
output_buffering = Off

我用灯。

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

$ php 测试.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
  • 不修改输出

谢谢!

4

0 回答 0