ホームページ  >  記事  >  バックエンド開発  >  phpはリアルタイム出力できない

phpはリアルタイム出力できない

WBOY
WBOYオリジナル
2023-05-07 10:57:08697ブラウズ

PHP は広く使用されているサーバー側スクリプト言語であり、Web リクエストの処理やデータベースとの対話などのタスクによく使用されます。ただし、PHP は特定のタスクを実行するときにリアルタイムで結果を出力できないようで、開発者にとっていくつかの課題が生じます。

この記事では、PHP がリアルタイムで出力できない理由を詳しく掘り下げ、いくつかの解決策を提供します。

問題の背景

PHP は Web 開発で広く使用されている言語であり、多くの Web アプリケーションは PHP を使用してユーザーのリクエストを処理します。リクエストを処理するとき、PHP は通常、HTML、JSON、XML ドキュメントなどの応答をクライアントに送信する必要があります。これらの応答は通常、Web サーバーがクライアント要求を受信した直後に生成され、送信されます。ただし、場合によっては、PHP がリアルタイムで応答を出力できない場合もあるようです。

たとえば、次の単純な PHP スクリプトについて考えてみましょう。

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

このスクリプトは、0 から 9 までの数値を単純に出力し、各数値の間に 1 秒の一時停止を行います。ただし、このスクリプトを Web ブラウザで実行すると、10 秒後にすべての数値が一度に出力されることがわかります。

これは、PHP がページの生成後に Web ブラウザーにページを送信するためです。この場合、PHP はスクリプトの実行が完了するまで待機し、ページ全体を生成してから Web ブラウザーに送信する必要があります。これは、スクリプトの実行中、ページ全体が生成されるまで Web ブラウザーには何も表示されないことを意味します。

これは通常、大量のデータの処理や外部 Web サービスとの対話など、長時間実行されるタスクを実行する必要がある場合に発生します。この場合、PHP はタスク全体が完了するまで待ってから結果をクライアントに送信する必要があり、これには数秒から数分かかる場合があります。

問題の原因

PHP がリアルタイムで応答を出力できない理由は、Web サーバーがページ応答をチャンク転送エンコーディングで処理するためです。

ブロック転送エンコーディングは、サーバーが応答を処理するときに使用される HTTP プロトコルのストリーミング テクノロジです。ブロック転送エンコーディング技術は、リクエストの応答処理においてレスポンスボディの長さが分からない場合、ボディが送信されるまでブロック単位で徐々にレスポンスボディを送信します。

PHP で echo 関数を使用して応答を出力する場合、PHP は実際には応答で送信する必要のあるデータの量を知りません。これは、PHP がチャンク転送エンコーディングを使用して応答を送信できないため、応答本文全体が生成されるまで待ってからクライアントに送信する必要があることを意味します。

この動作により、PHP のリアルタイム出力機能が非常に制限され、大きな応答を必要とするタスクを PHP が効果的に処理できなくなります。

解決策

PHP がリアルタイムで応答を出力できない問題には、いくつかの解決策があります。

フラッシュ関数を使用する

PHP はフラッシュを提供します。 function 、この関数を使用すると、プログラムは出力バッファの内容を Web ブラウザに即座に送信できます。したがって、スクリプト実行のステップ間でフラッシュ関数を呼び出して、リアルタイム出力を実現できます。

たとえば、上記の例を次のように変更できます。

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

この例では、各数値を出力した直後にフラッシュ関数を呼び出します。これにより、スクリプト全体の実行が完了するのを待たずに、出力をすぐに Web ブラウザーに送信するように PHP に指示されます。

注意事項

フラッシュ関数はリアルタイム出力の問題を解決できますが、他の問題を引き起こす可能性があります。たとえば、サーバーの送信バッファがいっぱいの場合、flush 関数を呼び出すとサーバーがハングし、バッファに送信を続行するのに十分なスペースが確保されるまで待機します。

さらに、フラッシュ関数を使用するとコストが非常に高くなるため、Web アプリケーションが遅くなります。したがって、フラッシュ機能の使用には注意が必要であり、過度の使用は避けてください。

JavaScript を使用する

PHP がリアルタイムで出力できない問題を解決するもう 1 つの方法は、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 関数は updateOutput 関数を呼び出し、この関数は 1 秒ごとに updateOutput 関数を呼び出すことに注意してください。これにより、応答が 2 秒ごとに Web ブラウザに送信され、ページに表示されます。

注意事項

JavaScript を使用するとリアルタイム出力の問題は解決できますが、いくつかの問題もあります。まず、断続的な通話が使用されるため、Web ブラウザとサーバーの間でより多くのネットワーク トラフィックが発生し、ネットワーク負荷が増加します。

また、JavaScript ソリューションには、flush 関数を使用する場合と同じパフォーマンスの問題があります。リアルタイム出力を処理するために追加する JavaScript コードが多すぎると、Web アプリケーションのパフォーマンスが重大な影響を受けます。

WebSocket の使用

WebSocket は、Web アプリケーションでリアルタイム データを送信するための標準であり、クライアントとサーバー間の双方向通信の長期接続を可能にします。

我们可以使用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应用程序的性能产生负面影响。因此,在选择解决方案时,请慎重考虑其适合您的特定需求。

以上がphpはリアルタイム出力できないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。