Зарегистрируйте уход пользователя из сеанса PHP / JQuery Comet - PullRequest
0 голосов
/ 16 марта 2012

Я пишу чат-клиент в Codeigniter и JQuery, используя кометный фреймворк со следующим кодом (где doc_id - это идентификатор чата, который обновляется).

Javascript:

$(document).ready(function() {

var timestamp = null;
var doc_id = ($('#doc_id').length !== 0) ? $('#doc_id').val() : 'lobby';

//adapted from Comet tutorial at http://www.screenr.com/SNH 
function waitForMsg() {
            //ping server and wait for response
    $.ajax({
        type: "GET",
        url: "/index.php/documents/chat_call/" + timestamp + '/' + doc_id ,
        async: true,
        cache: false,
        //when data comes back, parse, and then ping again
        success: function(data) {
            var json = $.parseJSON(data);
            //code to update chat with JSON data                

            timestamp = json['timestamp'];
            setTimeout(waitForMsg, 1000);
        }
    });
}   
//immediately upon arrival, begin waiting for changes to chat
waitForMsg();
});

И PHP:

    //adapted from Comet tutorial at http://www.screenr.com/SNH
function chat_call($browser_timestamp, $doc_id) {
            //get name of flat file for chat
    $filename = $_SERVER['DOCUMENT_ROOT'] . '/docs/log' . $doc_id . '.html';

    //create file if it's not there
    if (!file_exists($filename)) {
        $handle = fopen($filename, 'w');
        fclose($handle);
    }

            //time submitted by the browser
    $lastmodif = isset($browser_timestamp) ? $browser_timestamp : 0;
            //time of last change to file
    $currentmodif = filemtime($filename);

            //wait until file has been changed more recently than browser call
    while ($currentmodif <= $lastmodif) {
        usleep(1000);
        clearstatcache();
        $currentmodif = filemtime($filename);
    }

            //get contents of file and return as JSON
    $response = array();
    $response['msg'] = file_get_contents($filename);
    $response['timestamp'] = $currentmodif;

    echo json_encode($response);
}

Все это работает довольно хорошо, насколько это возможно, и у меня есть другая функция, которая уведомляет, когда пользователь прибыл, и добавляет соответствующее уведомление к плоскому файлу. У меня проблемы с регистрацией отправления пользователя. Кажется, что я должен быть в состоянии что-то обработать, когда цикл while разорван, но я не могу понять, как именно.

Я изучал такие функции, как register_shutdown_function () и connection_aborted (), но я не уверен, куда в PHP-функции они должны идти. Может ли кто-нибудь дать мне представление о том, каким будет наилучший подход?

(Кстати, я немного искал на SO и знаю, что многие здесь предложили node.js для такого рода вещей. Хотя я и собираюсь в конечном итоге возиться с этим, это на В основном это только для личного проекта для меня и пары друзей, и у меня есть большая часть фреймворка на PHP, поэтому я хотел бы сначала сделать это на PHP, если это вообще возможно, а затем посмотреть, как его перенести. если я решу сделать его более масштабируемым.)

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...