Вы должны разрешить приложению уничтожать запросы к базе данных, а также реализовать более сложное взаимодействие между клиентом и сервером, которое может привести к дырам в безопасности, если все сделано неправильно.
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
может занять некоторое время в состоянии «убийство».
Так что это должен быть последний из нескольких возможных вариантов. Но иногда это нужно делать, у меня даже когда-то была программа, в которой вы могли бы перечислить свои собственные запущенные запросы, чтобы убить их, что было необходимо из-за «квот» (вы не могли выполнить более двух или трех запросов на отчет одновременно ).