重要な編集: (1日後)
テストした後、これはとても悪い解決策であることがわかりました。
テストケース:
- クライアント:8つのクライアントを実行します(1つのブラウザー(Chromium、(k)ubuntu)、1つのタブ、8つのiframeで)。
- サーバーAPI:Apache2.0ハンドラー
- PHPバージョン5.3.10-1ubuntu3.4
結果:
6SSE接続が開かれました。ただし、2つのSSE接続は保留のままです。サーバーの他のページは、SSEクライアントを閉じるまで開くことができません。
ただし、サーバーはajaxによって多くのクライアントを処理できます(1秒ごとにajaxを繰り返します)。
古い答え:
共有メモリを使用します。
sse.php
<?php
header("Content-Type: text/event-stream\n\n");
header('Cache-Control: no-cache');
$key = "987654";
$permissions = 0666;
$size = 1024;
//Create or open the shared memory segment.
$segment = shm_attach($key, $size, $permissions);
$msg = ' null ';
$last_time = 0;
$time = 0;
while (1) {
if (shm_has_var($segment, 0)) {
$time = shm_get_var($segment, 0);
}
if (shm_has_var($segment, 0)) {
$msg = shm_get_var($segment, 1);
}
$now = time();
if ($last_time < $time) {
$last_time = $time;
echo 'data: msg(' . $msg . ') time(' . $time . ')';
echo "\n\n";
}
ob_flush();
flush();
sleep(1);
}
trigger.php
<?php
if (isset($_GET['msg'])) {
$key = "987654";// TODO: how to generate suitable key?
$permissions = 0666;
$size = 1024;
$segment = shm_attach($key, $size, $permissions);
$time = time();
$msg = $_GET['msg'];
shm_put_var($segment, 0, $time);
shm_put_var($segment, 1, $msg);
echo $time;
}
この方法の欠点:
- 1秒の遅延
- 長時間開いている接続。これにより、スケーラビリティが低下します。
私の実装では、sse.phpは1秒以内に最後のメッセージのみを送信します。しかし、それを改善してデータベースを使用することができます。(trigger.phpが1秒間に3回呼び出された場合、最後のメッセージのみが保存されます)