为什么 php 命令 flush 在 Safari 中不起作用?

问题描述 投票:0回答:1

我有一个耗时的php脚本,所以我想给用户一些反馈。简化它以解决核心问题。此脚本在 Firefox 中运行良好(立即刷新输出),但 Safari 会等待所有内容生成。为什么?我该如何解决?

<?php
ini_set('max_execution_time', 0);
header('Content-Encoding: none;'); 
header('Content-type: text/html; charset=utf-8');

$j = 8;
$k = pow(2, 10);

echo "One moment please...".str_pad('', $k)."<br />\n<br />\n";
flush();

$i = 0;
while ($i < $j) { 
    $i++;
    echo "Test ".$i.str_pad('',$k)."<br />\n";
    flush();
    sleep(1);
} 
?>

顺便说一下:Chrome 根本不会加载这个页面,它给了我

ERR_CONTENT_DECODING_FAILED
.

此外,我试着把

<IfModule mod_env.c>
    SetEnv no-gzip 1
</IfModule>

在 .htaccess 中,但没有运气。也试过

SetEnv no-gzip dont-vary
。任何线索如何让 Safari(和 Chrome)与 Firefox 一样?

编辑: 我看到这个问题因为“缺乏研究”而被否决了。我想让问题尽可能简单,但我想让你知道我花了一整天的时间试图让它发挥作用。我在 php.net 上阅读了关于

flush()
ob_flush()
ob_start()
等的所有内容,并且我阅读了过去 20 多年以来几乎所有关于 flush 的问题以及 Stackoverflow 上的所有评论。 我尝试添加
ini_set('output_buffering', 'On');
ini_set('output_buffering', 'Off');
,添加
ob_start(null, 4096);
ini_set('zlib.output_compression', 'Off');
header('Cache-Control: no-cache');
header('X-Content-Type-Options: nosniff');
和/或
header('X-Accel-Buffering: no');
。我把
@ob_flush();
放在我的
flush();
之前或之后,试图将
str_pad
的值提高到2^16(65,536)但没有任何帮助。
不幸的是,我似乎无法控制我的托管服务提供商(运行 PHP 8.1 和 FastCGI)的 Apache 服务器。因为它可以在 Firefox 上运行,我想我一定做对了。

php google-chrome firefox safari flush
1个回答
0
投票

编辑:

ob_start("ob_gzhandler")
旨在用作 ob_start() 的回调函数,以帮助促进将 gz 编码数据发送到支持压缩网页的 Web 浏览器。 来源

<?php
ini_set('max_execution_time', 0);
header('Content-Encoding: none;');
header('Content-type: text/html; charset=utf-8');
ob_start("ob_gzhandler");
$j = 8;
$k = pow(2, 10);

echo "One moment please...".str_pad('', $k)."<br />\n<br />\n";


$i = 0;
while ($i < $j) {
    $i++;
    echo "Test ".$i.str_pad('',$k)."<br />\n";
    ob_flush();
    sleep(1);
}
?>

输出(在 Chrome 上):

请稍等...

测试1 测试2 测试3 测试4 测试5 测试6 测试7 测试8

© www.soinside.com 2019 - 2024. All rights reserved.