Heim  >  Fragen und Antworten  >  Hauptteil

Warum funktioniert der PHP-Befehl „refresh“ in Safari nicht?

<p>Ich habe ein zeitaufwändiges PHP-Skript, deshalb wollte ich den Benutzern etwas Feedback geben. Vereinfachen Sie es, um das Kernproblem zu lösen. Das Skript funktioniert in Firefox einwandfrei (die Ausgabe wird sofort aktualisiert), Safari wartet jedoch darauf, dass alle Inhalte generiert werden. Warum? Wie kann ich dieses Problem lösen? </p> <pre class="brush:php;toolbar:false;"><?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 "Einen Moment bitte...".str_pad('', $k)."<br />n<br />n"; spülen(); $i = 0; while ($i < $j) { $i++; echo "Test ".$i.str_pad('',$k)."<br />n"; spülen(); Schlaf(1); } ?></pre> <p>Übrigens: Chrome lädt diese Seite überhaupt nicht, es wird mir <code>ERR_CONTENT_DECODING_FAILED</code> angezeigt. </p> <p>Außerdem habe ich versucht,</p> <pre class="brush:php;toolbar:false;"><IfModule mod_env.c> SetEnv no-gzip 1 </IfModule></pre> <p> in .htaccess, aber kein Glück. Habe auch <code>SetEnv no-gzip dont-vary</code> ausprobiert. Irgendwelche Hinweise, wie man Safari (und Chrome) dazu bringt, dasselbe zu tun wie Firefox? </p> <hr /> <p>Ich habe auf php.net über <code>flush()</code>, <code>ob_flush()</code>, <code>ob_start()</code> usw. gelesen ., und ich habe in den letzten über 20 Jahren fast jede Frage zu Flush und jeden Kommentar zu Stackoverflow gelesen. Ich habe versucht, <code>ini_set('output_buffering', 'On');</code> oder <code>ini_set('output_buffering', 'Off');</code> hinzuzufügen und dabei <code> ob_start(null,Chapter 4096<code>header('X-Content-Type-Options: nosniff');</code> und/oder<code>header('X-Accel-Buffering: no') ;< /code>. Ich habe <code>@ob_flush();</code> vor oder nach <code>flush();</code> wurde auf 2^16 (65.536) erhöht, aber das hat nicht geholfen. Leider kann ich den Apache-Server (mit PHP 8.1 und FastCGI) bei meinem Hosting-Anbieter nicht steuern. Jetzt, wo es unter Firefox funktioniert, muss ich wohl etwas richtig machen. </p>
P粉141925181P粉141925181434 Tage vor634

Antworte allen(2)Ich werde antworten

  • P粉684720851

    P粉6847208512023-09-05 13:36:23

    感谢hareth py我找到了答案!

    <?php 
    ini_set('max_execution_time', 0);
    header('Content-Encoding: none;');
    header('Content-type: text/html; charset=utf-8;');
    ob_start("ob_gzhandler");
    $j = 200;
    $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();
        usleep(100000);
    } 
    ?>

    我将 $j 提高到 200,并将睡眠时间降低到 0.1 秒。 Safari 确实响应有点慢,但最终还是会逐行显示。就像 Firefox 和 Chrome 一样。

    Antwort
    0
  • P粉762447363

    P粉7624473632023-09-05 09:01:35

    编辑:
    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 上):

    Antwort
    0
  • StornierenAntwort