允许PHP在脚本运行时“回显”

考虑以下非常简单的PHP代码:

for ($x = 0; $x < 100; $x++) { echo "$x \r\n"; sleep(1); } 

在一个标准的PHPconfiguration中,这应该会产生一个错误500或者一些等价的告诉用户脚本超时。 我想知道是否可以这样做,以便PHP仍然可以通过一些任意X输出数字0,X可能是php.ini设置超时的秒数。

在做这方面的研究,我发现这堆栈溢出: https : //stackoverflow.com/questions/2513110/is-there-a-way-to-make-php-progressively-output-as-the-script-executes 。 根据线程中给出的解决scheme,有一些方法可以根据具体情况来实现这一点(即,您必须专门编写每个脚本以使其正确输出)。

上面提到的注释也提到你已经将output_buffering php.ini条目设置为零,以便它能够工作,但是你仍然必须执行ob_flush()flush()来实际输出任何数据。

所以,我的问题是:是否有可能configurationPHP的脚本总是会逐步发送到浏览器? 为了简单起见,我们可能想要假设Web服务器会立即将数据发送到浏览器(而不是缓冲数据,然后发送它)。 谢谢!

编辑:澄清, 任何脚本我的意思是字面上任何PHP脚本在服务器上,这些脚本不应该调用任何特殊的function,为了逐步输出工作。

ob_implicit_flush()

编辑:这就是auto_prepend_file的用途。

这里有很多问题。

第一个脚本/networking服务器超时 – 超时有一个很好的理由 – 另请参阅https://stackoverflow.com/questions/4678790/how-do-i-set-time-limit-for-loop但这些实际是什么,并且在执行代码时他们适用的哪个点是不同的&#x3002;

第二 – 我怀疑你的代码实际上正在做一些比多次调用sleep(1)更有趣的事情 – 你应该如何去解决这个问题取决于它正在做的其他事情 – 如果执行线程不在PHP之外,那么你在PHP中可以做的事情是非常有限的(这会影响内存 – 例如运行一个返回大量logging集的查询)

第三,如果您已经关注超时,那么向用户反馈意见并不能解决任务由于需要花费的时间而没有完成的任何问题 – 您应该考虑独立运行stream程并轮询进度通过Ajax或PHP中的刷新页面。 注意,运行不同的进程和线程并不像听起来那么简单。

第四,你问的唯一明确的问题是“是否可以configurationPHP,使得脚本总是被逐步发送到浏览器?”。 这里有几个答案,build议你使用刷新 – 但只是刷新缓冲区到networking服务器 – 是否networking服务器决定发回到浏览器是未定义的,并在什么阶段浏览器select渲染块也是未定义的 – 它可能在当前的设置上工作 – 但它不是可移植的。