时间:2021-07-01 10:21:17 帮助过:88人阅读
date_default_timezone_set("America/New_York");
header("Content-Type:text/event-stream");
$userid = $_SESSION['userid'];
//session_write_close();
$db = get_db();
while(true) {
$notices = $db->lRange("User:{$userid}:Notice", 0, -1);
$notice_num = 0;
foreach ($notices as $value) {
$readed = $db->hGet("Notice:{$value}:Info", 'readed');
if ($readed == false) {
$notice_num++;
}
}
echo "event: ping\n";
$curDate = $notice_num;
echo 'data: {"time": "' . $curDate . '"}';
echo "\n\n";
ob_flush();
flush();
sleep(30);
}
前端js:
var evtSource = new EventSource(serverName + 'index.php/Home/NoticePush/index');
evtSource.addEventListener("ping", function(e) {
var obj = JSON.parse(e.data);
$('div#header div#user_notice a').text(obj.time);
}, false);
使用php+js实现服务器推,在wamp环境中可以生效,但转移到Linux下的nginx上,就不能用了,是环境配置问题?要如何配置?
以下是相关代码
服务器端php代码:
date_default_timezone_set("America/New_York");
header("Content-Type:text/event-stream");
$userid = $_SESSION['userid'];
//session_write_close();
$db = get_db();
while(true) {
$notices = $db->lRange("User:{$userid}:Notice", 0, -1);
$notice_num = 0;
foreach ($notices as $value) {
$readed = $db->hGet("Notice:{$value}:Info", 'readed');
if ($readed == false) {
$notice_num++;
}
}
echo "event: ping\n";
$curDate = $notice_num;
echo 'data: {"time": "' . $curDate . '"}';
echo "\n\n";
ob_flush();
flush();
sleep(30);
}
前端js:
var evtSource = new EventSource(serverName + 'index.php/Home/NoticePush/index');
evtSource.addEventListener("ping", function(e) {
var obj = JSON.parse(e.data);
$('div#header div#user_notice a').text(obj.time);
}, false);
因为nginx缓冲区问题,默认nginx是有缓冲区,php的刷新输出对nginx无效的。
需要输出前面再加个
header('X-Accel-Buffering: no');