【问题标题】:Some Browser Pages Only Load After All PHP is Processed某些浏览器页面仅在处理完所有 PHP 后加载
【发布时间】:2016-09-02 14:46:30
【问题描述】:

我遇到了一个问题,某些浏览器(通过我使用多台计算机)似乎以不同的方式处理/显示 PHP。假设我在 test.php 上有以下循环

<?PHP
for($i=0;$i<10000;$i++){
   echo "This is loop number $i.<br/>";
}
>?

当我加载 test.php 时,我希望看到的每一行“这是循环编号 #”在处理 PHP 时一个接一个地出现。

我最终在某些浏览器(主要是我的主计算机上的 firefox)上看到的是 test.php 将加载(不显示任何内容),然后最终打开所有已存在的回显行。

有没有办法强制浏览器(或网页)在前进时显示 PHP 而不是等待它完成?

感谢任何帮助/建议,

罗南

【问题讨论】:

  • 我可以用firefox和edge确认问题,opera和chrome立即输出内容。检查此答案以了解为什么stackoverflow.com/a/6926886/797495
  • 我已经看了一下这个,但是即使使用了 firefox 和 chrome 的标题仍然无法加载页面,因为 PHP 正在进行中。

标签: php firefox browser


【解决方案1】:

引用different answer

HTML5 字符集嗅探缓冲区大小为 512 字节。所以回应 需要有 512 字节的填充或设置一个字符集(通过 标记或 HTTP 标头)。


我可以确认 延迟输出发生在 FirefoxEdgeChromeOpera 上立即输出内容,与缓冲区大小无关。

只要str_pad 的大小为&gt; 1024,下面的代码在所有浏览器上实时 输出(此值可能因浏览器而异)

while (@ob_end_flush());
ob_implicit_flush(true);
echo "first line visible to the browser";
echo str_pad("",1024," "); // try lower values and the "first line" won't be displayed instantly
echo "<br />";
sleep(5);
echo "second line visible to the browser after 5 secs";

php.ini摘录:

output_buffering

;输出缓冲是一种控制输出数据量的机制 ; (不包括标头和 cookie) PHP 应该在内部保留之前 推动那个;数据给客户端。如果您的应用程序的输出 超过此设置,PHP ;将大致以大块的形式发送该数据 您指定的尺寸。 ;开启此设置并管理其 最大缓冲区大小可以产生一些;有趣的副作用 取决于您的应用程序和 Web 服务器。 ;你也许可以 在您已经发送输出后发送标头和 cookie;通过 打印或回显。如果您的服务器是 ;与 PHP 流相比,由于缓冲输出而发出更少的数据包 输出 ;因为它得到它。在生产服务器上,4096 字节是 良好的性能设置;原因。 ;注意:输出缓冲可以 也可以通过输出缓冲控制进行控制;职能。 ; 可能的值:; On = 启用且缓冲区不受限制。 (与 小心);关闭 = 禁用;整数 = 启用缓冲区并设置 它的最大大小(以字节为单位)。 ;默认值:关闭;开发价值: 4096;产值:4096; http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering

你可以试试

output_buffering = off  

但是您的服务器性能可能会受到影响。

【讨论】:

  • 我尝试添加标题条件并运行您提供的代码;我正在查看的两个页面,并且此测试 sn-p 仅在处理完所有内容后才加载。这在 Chrome 和 Firefox 上。我想澄清一下,这只会影响我作为管理员,没有其他人会看到这些页面;因此,如果有客户端“黑客”可能也可以。
猜你喜欢
  • 2013-06-11
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多