important EDIT: (after a day)
after testing i found this is so bad solution.
test case:
- clients: run 8 clients (in one browser(Chromium,(k)ubuntu), one tab, 8 iframe).
- Server API: Apache 2.0 Handler
- PHP Version 5.3.10-1ubuntu3.4
result:
6 SSE-connections opened. but 2 SSE-connections left pending. other pages in server cannot be open until close SSE-clients.
but server can handle many clients by ajax (repeat ajax every 1 second).
Old Answer:
use share memory.
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;
}
disadvantage of this way:
- one second delay
- long time open connections. and this cause non-Scalability.
in my implementation sse.php send only last message in a second. but you can improve it and use database. (if trigger.php called 3 times in a second, then only last message saved)