2012-01-05 2 views
1

Я создаю систему уведомлений, что мгновенно проверяет, есть ли какие-либо новые уведомления для онлайн-пользователя.Длинный опрос Становится призраком

Вот мой сценарий до сих пор:

//...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(); 

Это работает, но если оставить страницу, веб-сервер не ответит (на клиентской стороне) , пока не закончится сценарий «уведомлений.php».

Что я могу сделать, чтобы убить скрипт, если клиент покидает страницу?

Мой веб-сервер У включен Apache Gzip - это будет ждать завершения буфера? Спасибо.

+0

JavaScript должен быть написан асинхронно. 'checkNotify' - это один var, который пытается быть перезаписан вместо создания новых экземпляров. – rxgx

ответ

0

У Apache есть некоторые функции для поддержки COMET. Я слышал это. Вы можете пойти на это.

Или другой вариант использует рамку Grizzly на сервере приложений Glassfish.

Или другое решение - использовать Lightstreamer. Угадай, что? Если вы пишете собственный код,

они могут нормально работать в локальной системе, но это может вызвать проблемы с сервером в режиме реального времени.

Так что я думаю лучший вариант, чтобы найти то, что уже построен в течение длительного времени

научно-исследовательские работы. Потому что это скорее нечто вроде «взлома», а не «технологии».