Я запускаю сервер статистики на работе, который иногда становится довольно медленным из-за количества запросов, запущенных на нем.
Наша маркетинговая команда использует его в качестве основного инструмента статистики. Некоторые люди в команде иногда просто заканчивают сценарий до его окончания (закрывая свой браузер или вкладку). Тем временем SQL-запросы продолжают выполняться.
Как я могу убить или остановить связанные запросы 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
чтобы удалить их.
РЕДАКТИРОВАТЬ
Хорошо, если речь заходит о закрытии браузера, я вижу несколько подходов:
(Назначение: обсудите достоинства и недостатки всех подходов.)
Ни один из них не поражает меня так красиво, но с некоторой работой они могут быть созданы для работы. Честно говоря, когда у нас была эта проблема, мы просто сохранили список процессов и убили то, что выглядело как странные запросы.
к сожалению, вы не можете много сделать, если они просто нажимают кнопку закрытия в своем браузере. В списке уже есть встроенные функции, которые будут проверять сеанс. Возможно, попробуйте кэшировать наиболее часто используемые запросы. Google «кеширование php mysql».
Если это не сработает, вы можете создать его с помощью AJAX и каждый раз, когда запрос будет завершен, сервер отправит обратно сообщение, информирующее пользователя о ходе выполнения запроса. Это, скорее всего, уменьшит количество людей, просто отказавшихся от своей сессии.
Лучший способ (я думаю) – закрыть соединение сразу после использования. Также может быть установлена переменная session_timeout (например, уменьшена до 20 секунд); в этом случае соединение будет автоматически закрыто.
С некоторыми моими коллегами мы пришли к следующей идее:
Мы проверим это в течение следующих нескольких часов, я обновлю здесь, как только мы будем уверены, что это работает.