Убить запрос MySQL во время выполнения с помощью PHP и AJAX - PullRequest
1 голос
/ 16 августа 2011

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

В настоящее время я могу уничтожить только вызов AJAX, который я отправил, и моя страница прекрасно работает на стороне пользователя

, но я ищу код PHP, чтобы остановить запрос MYSQL на стороне серверапотому что некоторые запросы могут быть довольно тяжелыми и выполняться долго

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

Прежде всего, если целью запроса является просто проверка синтаксиса, не выполняйте его! выполнить объяснение, или добавить предел 0, или выполнить для пустой базы данных.

Что касается убийства, вам необходимо подключиться к базе данных с привилегиями root и выполнить команду KILL (но вам нужно знать идентификатор запроса). Или вы можете убить всю ветку. Взгляните на mysqli :: kill

Редактировать: кажется, вам не нужны привилегии суперпользователя, чтобы просмотреть запросы вашего пользователя, используйте команду SHOW PROCESSLIST

1 голос
/ 16 августа 2011

Я считаю, что идентификатор_потока, сообщаемый CONNECTION_ID () , совпадает с идентификатором потока, использованным в mysqladmin ....

Вам нужно захватить идентификатор процесса для соединения перед началом запроса ...

$qry="SELECT CONNECTION_ID() AS c";
$row=mysql_fetch_assoc(mysql_query($qry));
$_SESSION['mysql_connection_id']=$row['c'];

затем, когда пользователь нажимает кнопку, сделайте что-то вроде ....

exec('mysqladmin -u $user -p$password killproc ' 
          . $_SESSION['mysql_connection_id']);

Но это открывает возможность пользователям убивать запросы других людей. Вы можете ввести ключ комментария, например, идентификатор сессии php в начале каждого запроса (mysqladmin усекает текст запроса), а затем использует список процессов mysqladmin для проверки владения и / или получения идентификатора потока перед его уничтожением.

0 голосов
/ 11 сентября 2015

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

Start-Request должен содержать сессию и идентификатор страницы (защищенный идентификатор, поэтому не 3 и 4 и 5, а какой-то не угадываемый, но уникальный хэш). Затем бэкэнд связывает этот идентификатор с запросом. Это может быть сделано в какой-то дополнительной таблице базы данных или в случае повторного использования, если у вас все равно есть redis, но также с помощью комментариев в запросе SQL, например, "Session fid98a08u4j, Page 940jfmkvlz" => s:<session>p:<page>.

/* s:fid98a08u4jp:940jfmkvlz */ select * from ...

Если пользователь нажимает «Отмена», вы отправляете запрос на отмену с сеансом и идентификатором страницы на сервер. Затем php-код извлекает список запущенных SQL-запросов с помощью show processlist и ищет сеанс и страницу для извлечения идентификатора запроса.

Затем php отправляет

kill query <id>

к MySQL-серверу.

Это может привести к проблемам, когда транзакции не используются, и это может повредить репликации. И даже kill query может занять некоторое время в состоянии «убийство».

Так что это должен быть последний из нескольких возможных вариантов. Но иногда это нужно делать, у меня даже когда-то была программа, в которой вы могли бы перечислить свои собственные запущенные запросы, чтобы убить их, что было необходимо из-за «квот» (вы не могли выполнить более двух или трех запросов на отчет одновременно ).

0 голосов
/ 16 августа 2011

Нет. Это невозможно, так как вы закрываете соединение каждый раз, когда заканчивается выполнение. Нет способа (через PHP) управлять старыми "сессиями" (соединениями)

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