Я пишу чат-клиент в 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, если это вообще возможно, а затем посмотреть, как его перенести. если я решу сделать его более масштабируемым.)
Спасибо!