请考虑以下非常简单的 PHP 代码:
for ($x = 0; $x < 100; $x++)
{
echo "$x \r\n";
sleep(1);
}
在标准 PHP 配置中,这应该产生错误 500 或类似错误来告诉用户脚本超时。我想知道是否可以使 PHP 仍然通过某个任意 X 输出数字 0,X 可能是 php.ini 设置的超时秒数。
在对此进行研究时,我在 Stack Overflow 上发现了这一点:https://stackoverflow.com/questions/2513110/is-there-a-way-to-make-php-progressively-output-as-the-script-executes。根据线程中给出的解决方案,有办法根据具体情况实现这一点(即,您必须专门编写每个脚本以使其正确输出)。
上面提到的评论还提到,您已将output_buffering
php.ini 条目设置为零以使其工作,但您仍然必须执行ob_flush()
和 aflush()
才能实际输出任何数据。
因此,我的问题是:是否可以配置 PHP,以便脚本总是逐步发送到浏览器?为了简单起见,我们可能想假设 Web 服务器将立即将数据发送到浏览器(而不是缓冲数据,然后发送)。谢谢!
编辑:澄清,通过任何脚本我指的是服务器上的任何 PHP 脚本,并且这些脚本不必调用任何特殊函数才能使渐进式输出正常工作。
答案1
编辑:这就是auto_prepend_file
是为了。
答案2
这里实际上有很多问题。
首先 - 脚本/网络服务器超时 - 超时的存在是有充分理由的 - 另请参阅https://stackoverflow.com/questions/4678790/how-do-i-set-time-limit-for-loop但它们实际上是什么以及它们在代码执行的哪个阶段适用是不同的。
第二 - 我怀疑你的代码实际上在做一些比多次调用 sleep(1) 更有趣的事情 - 你应该如何解决这个问题取决于它正在做什么其他事情 - 如果执行线程在 PHP 之外,那么你在 PHP 中能做的事情就非常有限(这会影响内存 - 例如运行返回大量记录集的查询)
第三 - 如果您已经担心超时,那么向用户提供反馈并不能解决由于耗时而无法完成作业的任何问题 - 您应该考虑独立运行该过程并通过 Ajax 或 PHP 中的刷新页面轮询进度。请注意,运行不同的进程和线程并不像听起来那么简单。
第四 - 您提出的唯一明确问题是“是否可以配置 PHP,以便始终逐步将脚本发送到浏览器?”。这里有几个答案建议您使用 flush - 但这只是将缓冲区刷新到 Web 服务器 - Web 服务器是否决定将其发送回浏览器尚未定义,浏览器选择在哪个阶段呈现块也未定义 - 它可能适用于您当前的设置 - 但它不可移植。