Длинный опрос становится призраком - PullRequest
1 голос
/ 05 января 2012

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

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

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

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

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

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

1 Ответ

0 голосов
/ 05 января 2012

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

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

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

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

Так что я думаю, что лучший вариант - это найти что-то, что уже давно собрано

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

...