Убивать или останавливать запросы MySQL после выхода из скрипта PHP

Я запускаю сервер статистики на работе, который иногда становится довольно медленным из-за количества запросов, запущенных на нем.

Наша маркетинговая команда использует его в качестве основного инструмента статистики. Некоторые люди в команде иногда просто заканчивают сценарий до его окончания (закрывая свой браузер или вкладку). Тем временем SQL-запросы продолжают выполняться.

Как я могу убить или остановить связанные запросы PHP-скрипта, когда кто-то закрывает или покидает этот скрипт?

Мы, конечно, не хотим убивать эти запросы вручную (что мы уже делаем), но автоматически, как только человек покидает скрипт.

Большинство наших сценариев статистики основаны на предварительных расчетах, которые выполняются каждую ночь для самых тяжелых из них, и для нас это не проблема. Для остальных мы еще не выполнили предварительные расчеты, и мы хотели, чтобы они могли убивать сиротские запросы, прежде чем делать это.

Solutions Collecting From Web of "Убивать или останавливать запросы MySQL после выхода из скрипта PHP"

Вы можете проверить, все ли открыто соединение с браузером на вашем сервере, с использованием механизмов управления подключением и соответствующим образом реагировать.

Обратите внимание, однако, что все запущенные до сих пор SQL-запросы будут завершены – если они сложны, это может занять некоторое время, и нет внутриполосного способа их завершения: вам нужно будет посмотреть, какой поток работает, и что заброшенных нитей.

Иногда вам нужно уметь убивать запрос, который длится слишком долго. Если вы хотите сделать это в своей ОС, вы можете это сделать – это довольно безопасно, поскольку MySQL запускает все это в дочерних процессах. В Unix это ps и kill .

Вы также можете использовать MysqlAdmin для этого, и он должен быть в основном одинаковым для всех ОС. Вы получаете список процессов, которые выполняются:

 $ mysqladmin processlist # password if necessary +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 2 | root | localhost | | Query | 0 | | show processlist | +----+------+-----------+----+---------+------+-------+------------------+ 

Затем найдите mysqladmin kill чтобы удалить их.

РЕДАКТИРОВАТЬ

Хорошо, если речь заходит о закрытии браузера, я вижу несколько подходов:

  1. Ознакомьтесь с обработкой соединений PHP. Похоже, вы можете зарегистрировать дескриптор, который вызывается, если пользователь закрывает браузер.
  2. Если обработчик не вызван, возможно, вы можете вызвать межстраничную страницу, которая просто говорит «Выполнение запроса …», а затем рендеринг этой страницы может сидеть в цикле и ждать завершения запроса или завершения соединения , Если запрос завершен, перенаправляйтесь на страницу «результаты», и если соединение идет вниз, вручную запустите запрос (см. Выше).
  3. Если эти подходы окажутся бесплодными, есть еще один вариант. В браузере есть событие Javascript «on unload», которое запускается в ближайшем браузере. Быстрое сообщение Ajax, которое может отложить длительный запрос.

(Назначение: обсудите достоинства и недостатки всех подходов.)

Ни один из них не поражает меня так красиво, но с некоторой работой они могут быть созданы для работы. Честно говоря, когда у нас была эта проблема, мы просто сохранили список процессов и убили то, что выглядело как странные запросы.

к сожалению, вы не можете много сделать, если они просто нажимают кнопку закрытия в своем браузере. В списке уже есть встроенные функции, которые будут проверять сеанс. Возможно, попробуйте кэшировать наиболее часто используемые запросы. Google «кеширование php mysql».

Если это не сработает, вы можете создать его с помощью AJAX и каждый раз, когда запрос будет завершен, сервер отправит обратно сообщение, информирующее пользователя о ходе выполнения запроса. Это, скорее всего, уменьшит количество людей, просто отказавшихся от своей сессии.

Лучший способ (я думаю) – закрыть соединение сразу после использования. Также может быть установлена ​​переменная session_timeout (например, уменьшена до 20 секунд); в этом случае соединение будет автоматически закрыто.

С некоторыми моими коллегами мы пришли к следующей идее:

  • как только соединение MySQL установлено, получите connection_id () в SQL – CONNECTION_ID () doc в MySQL
  • храните его в некоторой переменной
  • после того, как пользователь покинет страницу (может быть, бросив ее или загрузив другую страницу), выполните событие js, которое запускает запрос KILL на основе предыдущей переменной

Мы проверим это в течение следующих нескольких часов, я обновлю здесь, как только мы будем уверены, что это работает.