前のページ(閑話休題)へ / 次のページ(サンプル wiki)へ
それでは COMET の解説です。 COMET とは Web アプリケーションにおいて サーバ側で決定したタイミングで サーバからクライアントへイベントを送る技術です。
従来の Web アプリケーションでは クライアントからサーバへリクエストを送り サーバからクライアントへレスポンスを返すだけでした。 あくまでもサーバは受動的にしか動作しないため サーバの状態の変化を素早くクライアントに伝えるには クライアント側から定期的にリクエストを送る必要がありました。
COMET ではまずクライアントが準備のためのリクエストを送ります。 リクエストに対してサーバはレスポンスを返さないで保留しておきます。 そしてサーバからイベントを送る際に初めて レスポンスをイベント内容と共に返します。 必要に応じてクライアントは再度リクエストを送り 次のイベントの通知を待ちます。 これによりサーバから任意のタイミングでイベントを送ることが出来ます。
例えば Web チャットのように クライアントがサーバ上のデータの更新を待っていて しかも更新された際にはすぐに反映したいという場合には COMET を使うことで通信量を減らすことが出来ます。 しかし、掲示板のような同期の必要性が低い サービスではあまり使わない方が良いと思います。
何故かというと Apache のような一般の httpd は クライアントを繋いだままにしておくように作られていないからです。 各通信スレッドやプロセスのメモリ消費量が大きいので 多数のクライアントが COMET で接続したとすれば 搭載メモリを全て使い果たしてしまう可能性があります。 もし大規模に COMET を使いたいのならば COMET 専用 httpd を書いた方が安全ではないでしょうか。 COMET 接続を処理する proxy というのも良いかもしれません。
COMET の簡単なサンプルを用意しました。 時刻を表示した html を返すだけの単純な php ですが、 サーバ時刻の秒の一の桁が 0, 5 になるまで待ってから レスポンスを返すようになっています。 時報というのも立派なイベントですよね。 (実行)
<html>
<head>
</head>
<body>
<?php
while (true) {
sleep(0.5);
$now = date('h:i:s');
if (preg_match('/.[05]$/', $now)) {
print $now."\n";
break;
}
}
?>
</body>
</html>