Как я могу получить подключения MySQL, чтобы закрыть, когда запрос AJAX прерван? - PullRequest
1 голос
/ 01 апреля 2011

Я использую cakephp и jquery, и ajax запрашивает данные mysql при выборе новой компании. Когда пользователь выбирает новую компанию до завершения загрузки старой компании, он прерывает запрос и создает новую. Проблема в том, что он оставляет соединение mysql открытым (долгое время, может быть, час). Я использую непостоянную версию MySQL Connect. Когда пользователь удерживает клавишу со стрелкой вниз для прокрутки компаний в множественном выборе, он открывает сотни соединений в течение нескольких секунд, а затем все имеет ошибки «слишком много соединений».

Вот мой javascript, когда компания меняется

if ($.companiesDivXHR) {$.companiesDivXHR.abort(); }
$.companiesDivXHR = $.ajax({
    url:"/companies/details",
    success:function(html) {
        $("companiesDiv").html(html);
    }
});

Другой пример может помочь: у меня похожая ситуация, когда у меня есть запрос ajax каждые 10 секунд, и он прерывается, если он еще не завершен. Когда запрашиваемая страница занимает приблизительно 30 секунд, она прерывается каждый раз, прежде чем ее можно отобразить (начиная с 30> 10), и снова соединение mysql остается открытым. Когда запрашиваемая страница ajax загружается сама по себе, проблем не возникает, и соединение закрывается, как и должно быть. Таким образом, эффект намного медленнее, но для одного пользователя в течение 20 минут он снова вызывает ошибку «слишком много подключений» (если максимальное количество подключений установлено на 100).

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011

Ссылка PHP ignore_user_abort , похоже, причина, по которой соединения не закрывались для меня, заключалась в том, что ignore_user_abort был установлен в false, что является значением по умолчанию.Когда установлено значение true, скрипт PHP продолжает выполняться после ajax .abort() или при нажатии клавиши escape в середине выполнения.Я проверил это, перейдя на страницу, которая была загружена запросом ajax, и нажав клавишу f5, а затем непрерывно нажимая escape.Каждый раз, когда я прерывал работу из браузера, другое соединение оставалось открытым (это было видно при использовании mytop в Ubuntu) и оставалось открытым в режиме «сна» до тех пор, пока не истечет время ожидания (где-то между 10 и 60 минутами, может быть, не уверен).Когда я включил ignore_user_abort, я делал то же самое, но каждое соединение оставалось открытым только в течение 30 секунд, то есть времени, которое требуется самой странице для загрузки.

0 голосов
/ 01 апреля 2011
  1. Рассматривали ли вы реализацию «задержки», чтобы запрос не выполнялся до тех пор, пока не будет выбран параметр в течение заданного промежутка времени (например, 1 секунда)?

  2. В непостоянной среде, как только запрос сделан к вашему PHP-сценарию, PHP-сценарий подключается к MySQL, делает свое дело, и соединение MySQL автоматически закрывается в конце выполнения сценария.

    Помня об этом, вызов .abort() на стороне клиента не останавливает выполнение сценария PHP, то есть не останавливает закрытие соединения MySQL. Он просто останавливает браузер от ожидания и получения чего-либо из скрипта PHP. Ваш PHP-скрипт должен завершить выполнение самостоятельно, чтобы соединение MySQL, которое он использует, было закрыто.

На ум приходит пара вещей, которые могут быть причиной вашей проблемы:

  1. У вас включены постоянные соединения MySQL где-то . Я недостаточно знаком с CakePHP, чтобы сказать вам, где искать.

  2. Ваш PHP-скрипт не завершается должным образом, и в этом случае вы ожидаете, пока истечет время ожидания PHP-скрипта, и в это время соединение MySQL останется открытым, что может привести к проблеме «слишком много соединений» .

  3. Ваш сервер MySQL не настроен для обработки такого количества запросов в течение такого короткого периода времени (маловероятно, но возможно). В этом случае единственный вариант - уменьшить количество запросов (например, реализовать задержку, упомянутую выше)

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