Heim  >  Artikel  >  Backend-Entwicklung  >  PHP kann nicht in Echtzeit ausgeben

PHP kann nicht in Echtzeit ausgeben

WBOY
WBOYOriginal
2023-05-07 10:57:08697Durchsuche

PHP ist eine weit verbreitete serverseitige Skriptsprache, die häufig für Aufgaben wie die Verarbeitung von Webanfragen und die Interaktion mit Datenbanken verwendet wird. Allerdings scheint PHP bei der Ausführung bestimmter Aufgaben nicht in der Lage zu sein, Ergebnisse in Echtzeit auszugeben, was Entwickler vor einige Herausforderungen stellt.

Dieser Artikel befasst sich mit den Gründen, warum PHP nicht in Echtzeit ausgeben kann, und bietet einige Lösungen.

Hintergrund der Frage

PHP ist eine in der Webentwicklung weit verbreitete Sprache und viele Webanwendungen verwenden PHP, um Benutzeranfragen zu bearbeiten. Bei der Verarbeitung einer Anfrage muss PHP normalerweise eine Antwort an den Client senden, beispielsweise ein HTML-, JSON- oder XML-Dokument. Diese Antworten werden normalerweise generiert und gesendet, sobald der Webserver die Client-Anfrage erhält. Allerdings scheint PHP in manchen Fällen nicht in der Lage zu sein, die Antwort in Echtzeit auszugeben.

Betrachten Sie zum Beispiel das folgende einfache PHP-Skript:

<?php
for ($i = 0; $i < 10; $i++) {
    echo "$i\n";
    sleep(1);
}
?>

Dieses Skript gibt einfach die Zahlen von 0 bis 9 aus, mit einer Pause von 1 Sekunde zwischen jeder Zahl. Wenn wir dieses Skript jedoch in einem Webbrowser ausführen, stellen wir fest, dass nach 10 Sekunden alle Zahlen auf einmal ausgegeben werden.

Das liegt daran, dass PHP die Seite nach der Generierung an den Webbrowser sendet. In diesem Fall muss PHP warten, bis die Ausführung des Skripts abgeschlossen ist, und die gesamte Seite generieren, bevor es sie an den Webbrowser sendet. Das bedeutet, dass der Webbrowser während der Ausführung des Skripts nichts sieht, bis die gesamte Seite generiert wurde.

Dies geschieht normalerweise, wenn Sie langwierige Aufgaben ausführen müssen, z. B. die Verarbeitung großer Datenmengen oder die Interaktion mit externen Webdiensten. In diesem Fall muss PHP warten, bis die gesamte Aufgabe abgeschlossen ist, bevor es die Ergebnisse an den Client sendet, was Sekunden oder Minuten dauern kann.

Der Grund für das Problem

Der Grund, warum PHP die Antwort nicht in Echtzeit ausgeben kann, liegt darin, dass der Webserver die Seitenantwort in Chunked-Transfer-Codierung verarbeitet.

Blocktransfer-Kodierung ist eine Streaming-Technologie im HTTP-Protokoll, die verwendet wird, wenn der Server Antworten verarbeitet. Wenn der Antwortprozess der Anfrage die Länge des Antwortkörpers nicht kennt, überträgt die Blocktransfer-Codierungstechnologie den Antwortkörper schrittweise in Blockeinheiten, bis der Körper gesendet wird.

Wenn wir in PHP die Funktion echo verwenden, um eine Antwort auszugeben, weiß PHP nicht wirklich, wie viele Daten in der Antwort gesendet werden müssen. Das bedeutet, dass PHP die Antwort nicht mit Chunked-Transfer-Codierung senden kann und warten muss, bis der gesamte Antworttext generiert ist, bevor es ihn an den Client sendet. echo函数输出响应时,PHP实际上并不知道在该响应中有多少数据需要发送。这意味着PHP无法使用块传输编码来发送响应,而必须等待整个响应体生成完毕后再将其发送到客户端。

这种行为使得PHP的实时输出功能非常受限,并且使PHP不能有效地处理需要大量响应的任务。

解决方案

针对PHP无法实时输出响应的问题,有几种解决方案:

使用flush函数

PHP提供了一个flush函数,该函数允许程序立即将输出缓冲区的内容发送到Web浏览器。因此,我们可以在脚本执行的步骤之间调用flush函数来实现实时输出。

例如,我们可以将上面的例子修改为:

<?php
for ($i = 0; $i < 10; $i++) {
    echo "$i\n";
    flush();
    sleep(1);
}
?>

在这个例子中,我们在输出每个数字之后立即调用flush函数。这告诉PHP立即将输出发送到Web浏览器,而不必等待整个脚本执行完毕。

注意点

尽管flush函数可以解决实时输出的问题,但它可能会导致其他问题。例如,如果服务器的发送缓冲区已满,调用flush函数会导致服务器挂起,并等待到缓冲区有足够的空间可以继续发送。

此外,由于使用flush函数是性能开销很大的,因此会使Web应用程序变得缓慢。因此,应该谨慎使用flush函数,避免过度使用。

使用 JavaScript

另一种解决PHP无法实时输出的方法是使用JavaScript。我们可以使用JavaScript编写一些代码来从Web浏览器向服务器发送请求,并将请求的响应作为页面的一部分显示。

例如,我们可以将上面的例子修改为:

<!DOCTYPE html>
<html>
<head>
    <title>Real-time PHP Output Example</title>
    <script type="text/javascript">
        function updateOutput() {
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    document.getElementById("output").innerHTML += xhr.responseText;
                }
            };
            xhr.open("GET", "output.php", true);
            xhr.send();
        }
        setInterval(updateOutput, 1000);
    </script>
</head>
<body>
    <div id="output"></div>
</body>
</html>

在这个例子中,我们使用JavaScript编写了一个函数updateOutput,该函数在每一秒钟向服务器发送一个请求,并将响应显示在页面的div标签上。服务器端的处理脚本output.php与上面的例子相同,它输出从0到9的数字。

注意,最后的setInterval

Dieses Verhalten schränkt die Echtzeitausgabefähigkeiten von PHP stark ein und verhindert, dass PHP Aufgaben, die große Antworten erfordern, effizient verarbeiten kann.

Lösung

Es gibt mehrere Lösungen für das Problem, dass PHP keine Antwort in Echtzeit ausgeben kann:

Verwenden Sie die Flush-Funktion

PHP bietet eine Flush-Funktion, die es dem Programm ermöglicht, den Inhalt des Ausgabepuffers sofort an den zu senden Webbrowser-Gerät. Daher können wir die Flush-Funktion zwischen den Schritten der Skriptausführung aufrufen, um eine Echtzeitausgabe zu erreichen.

Zum Beispiel können wir das obige Beispiel wie folgt ändern: 🎜
<!DOCTYPE html>
<html>
<head>
    <title>Real-time PHP Output Example</title>
    <script type="text/javascript">
        var ws = new WebSocket("ws://localhost:8080/");
        ws.onmessage = function(event) {
            var output = document.getElementById("output");
            output.innerHTML += event.data;
        };
    </script>
</head>
<body>
    <div id="output"></div>
</body>
</html>
🎜In diesem Beispiel rufen wir die Flush-Funktion unmittelbar nach der Ausgabe jeder Zahl auf. Dadurch wird PHP angewiesen, die Ausgabe sofort an den Webbrowser zu senden, ohne darauf zu warten, dass die Ausführung des gesamten Skripts abgeschlossen ist. 🎜🎜Hinweise🎜🎜Obwohl die Flush-Funktion das Problem der Echtzeitausgabe lösen kann, kann sie andere Probleme verursachen. Wenn beispielsweise der Sendepuffer des Servers voll ist, führt der Aufruf der Flush-Funktion dazu, dass der Server hängen bleibt und wartet, bis im Puffer genügend Platz zum Weitersenden vorhanden ist. 🎜🎜Da die Verwendung der Flush-Funktion außerdem leistungsintensiv ist, wird die Webanwendung dadurch langsamer. Daher sollte die Spülfunktion mit Vorsicht verwendet und eine übermäßige Nutzung vermieden werden. 🎜🎜JavaScript verwenden🎜🎜Eine weitere Möglichkeit, das Problem zu lösen, dass PHP nicht in Echtzeit ausgeben kann, ist die Verwendung von JavaScript. Wir können mithilfe von JavaScript Code schreiben, um eine Anfrage vom Webbrowser an den Server zu senden und die Antwort der Anfrage als Teil der Seite anzuzeigen. 🎜🎜Zum Beispiel können wir das obige Beispiel wie folgt ändern: 🎜rrreee🎜In diesem Beispiel verwenden wir JavaScript, um eine Funktion updateOutput zu schreiben, die jede Sekunde eine Anfrage an den Server sendet und die Antwort auf der Seite div anzeigt. code>-Tag. Das serverseitige Verarbeitungsskript <code>output.php ist das gleiche wie im obigen Beispiel, es gibt Zahlen von 0 bis 9 aus. 🎜🎜Beachten Sie, dass die letzte setInterval-Funktion die updateOutput-Funktion aufruft, die die updateOutput-Funktion einmal pro Sekunde aufruft. Dadurch wird jede Sekunde eine Antwort an den Webbrowser gesendet und auf der Seite angezeigt. 🎜🎜Hinweise🎜🎜Die Verwendung von JavaScript kann zwar das Problem der Echtzeitausgabe lösen, weist jedoch auch einige Probleme auf. Da intermittierende Anrufe verwendet werden, entsteht erstens mehr Netzwerkverkehr zwischen dem Webbrowser und dem Server, was zu einer erhöhten Netzwerklast führt. 🎜🎜Außerdem leidet die JavaScript-Lösung unter den gleichen Leistungsproblemen wie die Verwendung der Flush-Funktion. Wenn Sie zu viel JavaScript-Code hinzufügen, um die Echtzeitausgabe zu verarbeiten, wird die Leistung Ihrer Webanwendung stark beeinträchtigt. 🎜🎜Verwendung von WebSocket🎜🎜WebSocket ist ein Standard zur Übertragung von Echtzeitdaten in Webanwendungen. Er ermöglicht langfristige Verbindungen zwischen Clients und Servern für die bidirektionale Kommunikation. 🎜

我们可以使用WebSocket解决PHP无法实时输出的问题。当PHP向WebSocket服务器发送数据时,服务器可以立即将其转发给客户端,实现实时输出。

例如,我们可以将上述例子改成使用WebSocket:

<!DOCTYPE html>
<html>
<head>
    <title>Real-time PHP Output Example</title>
    <script type="text/javascript">
        var ws = new WebSocket("ws://localhost:8080/");
        ws.onmessage = function(event) {
            var output = document.getElementById("output");
            output.innerHTML += event.data;
        };
    </script>
</head>
<body>
    <div id="output"></div>
</body>
</html>

在这个例子中,我们使用JavaScript创建了一个WebSocket实例,并将其连接到一个WebSocket服务器。当服务器向客户端发送消息时,我们使用JavaScript将其显示在页面上。

在服务器端,我们可以使用PHP与WebSocket协议进行通信。PHP提供了一些WebSocket库,例如Ratchet(http://socketo.me/),可以方便地实现WebSocket协议。

注意点

虽然WebSocket提供了一种双向通信的实时数据传输协议,但它在实现时需要额外的工作。WebSocket需要与PHP结合使用,以便将实时输出响应发送到客户端。这使得使用WebSocket的实现更加复杂,并需要其他技术的帮助。

结论

PHP无法实时输出响应通常是因为Web服务器使用了块传输编码。这通常发生在需要执行长时间运行的任务时,例如处理大量数据或与外部Web服务交互。为了解决这个问题,我们可以使用flush函数、JavaScript和WebSocket等方案。这些解决方案都有一些限制,并且可能会对Web应用程序的性能产生负面影响。因此,在选择解决方案时,请慎重考虑其适合您的特定需求。

Das obige ist der detaillierte Inhalt vonPHP kann nicht in Echtzeit ausgeben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn