PHP + AJAX с MySQL - запрашивать каждые 2 секунды, слишком много в TIME_WAIT - PullRequest
2 голосов
/ 09 декабря 2010

У меня есть базовый HTML-файл, использующий ajax jQuery, который подключается к моему скрипту polling.php каждые 2 секунды.

Файл polling.php просто подключается к mysql, проверяет наличие нового идентификатора, чем скрытыйсохраненный текущий идентификатор, а затем эхо, если есть что-то новое.Поскольку javascript подключается каждые 2 секунды, я получаю тысячи соединений в TIME_WAIT только для моего клиента.Это потому, что мой скрипт снова и снова подключается к MySQL.Я пробовал mysql_pconnect, но это никак не помогло.

Есть ли способ заставить PHP открыть 1 соединение и продолжить запрашивать его?Вместо повторного подключения каждый раз и создания всех этих подключений TIME_WAIT.Не уверены, что нужно сделать, чтобы это работало правильно.

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Я фактически закончил делать базовый длинный опрос. Я сделал простой PHP-скрипт для бесконечного цикла while, и он запрашивает каждые 2 секунды. Если он находит что-то новое, он повторяет его и прерывает цикл. Мой JQuery просто AJAX подключается к нему, и ждет ответа; в ответ он обновляет мою страницу и перезапускает опрос. Очень просто!

PS, метод Long Polling также уменьшает проблемы с памятью браузера, а также радикально уменьшает соединения TIME_WAIT на сервере.

0 голосов
/ 09 декабря 2010

Нет тривиального способа сделать это, так как pconnect не работает при нескольких вызовах веб-страницы.Однако некоторые подходы к минимизации пропускной способности базы данных могут быть следующими:

  1. Уменьшите время опроса.(2 секунды, может быть, немного чрезмерно?)

  2. Иметь «основной» скрипт PHP, который запускается каждые n секунд, извлекает данные из базы данных и сохраняет их в соответствующем формате(сериализованный массив PHP, XML, данные HTML и т. д.) в файловой системе.(Я бы порекомендовал записать во временный файл, а затем переименовать поверх существующего, чтобы минимизировать какие-либо частичные проблемы с сбором файлов.) Страница PHP, запрошенная Ajax, просто использовала бы информацию в этом файле данных.

С точки зрения выполнения основного сценария PHP, вы можете либо использовать cron, либо просто позволить пользователю, который первым запрашивает страницу, когда содержимое файла считается слишком устаревшим.(Для этой цели вы можете использовать временную метку файла данных с помощью функции filemtime .) Я бы лично использовал последний подход, так как cron для этой цели является избыточным.

Вы можете взять этоеще дальше и используйте memcached вместо плоского файла и т. д., если это необходимо.(Тем не менее, это может быть слишком сложное решение на данном этапе дел.)

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