我正在创建一个通知系统,立即检查是否有针对在线用户的新通知。
到目前为止,这是我的脚本:
//...include(myscripts.php)...
function notificationsCount($id)
{
if(is_numeric($id) && !empty($id) && $id>0) return mysql_result(mysql_query("SELECT COUNT(*) FROM notifications WHERE unRead='1' AND userID = '$id'"),0);
}
if($_GET['getNotificiationCount'] && $_GET[userID])
{
$current = notificationsCount($_SESSION['userID']);
$count = 0;
while($count<20 && !connection_aborted()){
$c = notificationsCount($_SESSION['userID']);
if($c!=$current && $c!=0)
exit($c);
$count++;
sleep(1);
}
exit("0");
}
客户端:
var checkNotify;
$(window).unload(function () { checkNotify.abort(); } );
//Nav Notifications
function checkNotifications()
{
checkNotify = $.ajax({
url: "/notifications.php?getNotificiationCount=true&userID=<?=$_SESSION[userID]?>",
timeout: "30000",
cache: false,
success : function(data, textStatus, XMLHttpRequest) {
if(data!=0) {
$("#nav_notification_bubble").removeClass("displayoff");
$("#notification_count").html(data); }
checkNotifications();
},
error: function() {}
});
}
checkNotifications();
这样可行,但是如果我离开页面,Web服务器将不会响应(在我的客户端),直到“notifications.php”脚本完成。
如果客户端离开页面,我该怎么做才能终止脚本?
我的Web服务器确实打开了Apache Gzip - 是否会等待缓冲区完成? 感谢。
答案 0 :(得分:0)
Apache有一些支持COMET的功能我听说过。你可以去做。
或者另一个选择是在Glassfish Application Server中使用Grizzly框架。
或另一种解决方案是使用Lightstreamer。你猜怎么着?如果您编写自定义代码,
它们可能在本地系统中正常工作,但实时可能会给服务器带来太多麻烦。
所以我猜猜更好的选择是找到已经建成很长时间的东西
研究工作。因为这更像是'黑客'而不是'技术'。