У меня проблема с кометой ajax - после загрузки страницы все работает отлично, но когда я пытаюсь открыть другую страницу на том же хосте (какое-то меню или ссылку), эта страница загружается через долгое время (очень медленно).
Сервер Slackware 13.37 Apache / 2.2.20 PHP 5.3.8 и сценарий backend.php:
<?php
function my_abort_handler( ) {
write2file(connection_status() . ' SD Aborted!!!');
}
register_shutdown_function('my_abort_handler');
try {
error_reporting(0);
session_start();
if (!isUserLogedIn()) {
$return['message'] = "Login required";
$return['error'] = true;
echo json_encode($return);
exit();
}
if (empty($_SESSION['return'])) {
$_SESSION['return'] = false;
}
connectToDB();
while (!connection_aborted()) {
write2file(connection_status() . ' SD Aborted!!!');
$return = collectDataFromDB();
$d1 = array_diff_assoc($return, $_SESSION['return']);
$d2 = array_diff_assoc($return, $_SESSION['return']);
if ((!empty($d1)) || (!empty($d2))) {
$_SESSION['vote_return'] = $return;
echo json_encode($return);
flush();
ob_flush();
exit();
}
sleep(1);
}
} catch (Exception $e) {
$return['message'] = $e->getMessage();
$return['error'] = true;
echo json_encode($return);
}
На клиенте:
var xhReq = false;
function runComet() {
xhReq = GetXmlHttpObject();
xhReq.open("GET",'backend.php',true);
xhReq.onreadystatechange=consoleinfo;
xhReq.send(null);
}
function consoleinfo() {
if (xhReq.readyState == 4) {
if (xhReq.status == 200) {
console.info(xhReq.responseText);
} else {
console.info("Error Status:" + xhReq.status);
}
runComet();
}
runComet();
Seteps:
- Открыть страницу и выполнить javascript, поэтому есть запрос к backend.php
- Мониторинг файла журнала - каждые 1 секунду появляется новая строка
- Нажмите на кнопкуссылка / меню на странице и браузер начинают загружать следующую страницу.В консоли (firebug или chrome console) я вижу, что запрос ajax прерван.
- Отслеживание файла журнала - каждые 1 сек появляется новая строка, поэтому соединение с сервером не прерывается.
- Откройте http://localhost/server-status, и я вижу работника в состоянии "W", отправляющего ответ.
- Подождите некоторое время (каждый раз, когда оно отличается, но в большинстве случаев около 30 - 60 секунд) соединение закрывается, поэтомув файле журнала я вижу сообщение о прерывании.
- Загружается следующая страница
Я создаю очень простой случай - время возврата бэкэнда () в каждую секунду.и при обновлении браузера страницы: - ждет около 30 - 60 секунд, пока я не увижу сообщение об отмене в файле журнала или -realod страницу, но в файле журнала нет прерывания.Каждое relod добавляет нового работника в http://localhost/server-status, а строки, добавляемые в файл журнала, совпадают с рабочими.
Я пробую это на сервере CentOS 5.5, и результат будет таким же.Я использую конфигурацию apache defautl (добавьте только несколько виртуальных хостов и включите состояние сервера).
Я думаю, что есть проблема с настройкой, но я не могу понять, где.Можете ли вы помочь мне решить эту проблему.
ОБНОВЛЕНИЕ: Я использую netstat, чтобы проверить, что происходит.Когда запрос активен, вывод netstat:
tcp 0 0 127.0.0.1:35518 127.0.0.1:80 ESTABLISHED 2660/firefox off (0.00/0/0)
и после xhReq.abort()
вывод netstat:
tcp 1 0 127.0.0.1:80 127.0.0.1:35518 CLOSE_WAIT 3174/httpd keepalive (7167.02/0/0)
, поэтому в этом случае соединение будет поддерживаться в течение 7167 секунд и фонаСкрипт будет работать 7167 сек.Может быть, это что-то с конфигурацией ОС.