サーバーからクライアントにメッセージを送信するための別の手法があります。これには、接続を閉じないPHPスクリプト(またはサーバー側で使用している手法)に接続するiframeを使用する必要があります。その後、PHPスクリプトは、クライアントに何かについて通知する必要がある場合は常にJavaScriptメッセージを送信します。各メッセージの後で、サーバーは出力ストリームをフラッシュして、データが実際にクライアントに到達し、出力バッファーによってキャッシュされないようにします。これは、iframeにロードされたPHPスクリプトの小さなサンプルコードです(基本を示すために、テストも完了もされていません)。
<html>
<body>
<script type="text/javascript">
function receiveMsg(data)
{
// Do something with the data, for example send it to some function
// in the parent frame (Where your chat application lives)
}
<?php
while (true) // You may also implement some abort state which should
// be checked here
{
$data = waitForData(); // This is your magic function on the server
// which waits for data to be send to the client
echo "receiveMsg('" . $data . "');"; // Let's say data is just a string.
// You may want to use JSON instead
flush();
}
?>
</script>
</body>
</html>
この方法の利点は、ポーリングに依存しないことです。したがって、x秒ごとにサーバーにリクエストを送信する必要はありません。また、サーバー側で適切に処理を行うと、1人のユーザーから送信されたメッセージは、x秒後ではなく、他のユーザーによって可能な限り高速に受信されます。欠点は、チャットユーザーごとに永続的なHTTP接続があることです。ただし、これにより、サーバー上で必要なリソースが少なくなり、チャットユーザーごとに1分あたり数十の完全なHTTPリクエストが発生する可能性があります。