Ajax комета - медленно открывать следующую ссылку - PullRequest
0 голосов
/ 02 марта 2012

У меня проблема с кометой 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:

  1. Открыть страницу и выполнить javascript, поэтому есть запрос к backend.php
  2. Мониторинг файла журнала - каждые 1 секунду появляется новая строка
  3. Нажмите на кнопкуссылка / меню на странице и браузер начинают загружать следующую страницу.В консоли (firebug или chrome console) я вижу, что запрос ajax прерван.
  4. Отслеживание файла журнала - каждые 1 сек появляется новая строка, поэтому соединение с сервером не прерывается.
  5. Откройте http://localhost/server-status, и я вижу работника в состоянии "W", отправляющего ответ.
  6. Подождите некоторое время (каждый раз, когда оно отличается, но в большинстве случаев около 30 - 60 секунд) соединение закрывается, поэтомув файле журнала я вижу сообщение о прерывании.
  7. Загружается следующая страница

Я создаю очень простой случай - время возврата бэкэнда () в каждую секунду.и при обновлении браузера страницы: - ждет около 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 сек.Может быть, это что-то с конфигурацией ОС.

Ответы [ 2 ]

0 голосов
/ 31 января 2013

У меня была та же проблема, но я вызвал свою кометную функцию ajax через 10 секунд, когда страница загружается как

$(function(){
  setTimeout('updateFeed()',10000);
});

и это работает как шарм

0 голосов
/ 02 декабря 2012

Проблем здесь две:

Первое: медленная загрузка следующей страницы - это потому, что на каждой странице я использую session_start(). Если я запускаю сессию в backend.php, сессия будет закрыта и сохранена после завершения скрипта (потому что я никогда не пишу и не закрываю его). По этой причине следующая страница открывается так медленно (на следующей странице также используется session_start()). Чтобы решить эту проблему, я удаляю session_start() из backend.php, но если вы добавите 'session_write_close ()', это тоже должно решить проблему.

Второе: backend.php не останавливает выполнение - это потому, что я использую mod_php и php не может обнаружить отключение / закрытие браузера. Для обнаружения отключения браузера php-скрипт должен прислать какой-то вывод. В backedn.php я добавляю echo '0'; flush(); ob_flush(); для выполнения в каждом цикле while. Таким образом, backend.php будет выводить «0» в каждом цикле и обнаруживать, когда браузер был отключен (была открыта другая страница или нажата кнопка «Стоп») или закрыт, и его выполнение остановится. На стороне клиента я заменяю .replace(/^0*/, '');, поэтому я удаляю все ненужные данные.

Это решает проблему - теперь серверный скрипт останавливает свое выполнение, когда браузер пытается открыть другую страницу, и следующая страница (на этом сервере) открывается вовремя.

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