PHP: Отмена запроса в MySQL по обрыву соединения с браузером
От: shestero  
Дата: 19.12.13 21:20
Оценка:
Проблема: Если во время выполнения долгого запроса через PHP к MySQL соединения с браузером обрывается (таймаут, сброс со стороны пользователя, аварийный обрыв связи итп), запрос продолжает выполнятся в СУБД, бесполезно потребляя ресурсы.

Предполагаемое решение:
Как я прочитал, PHP не умеет определять состояние соединения с браузером, когда ничего туда не посылается. Предполагаю посылать нулевые байты.
(Кстати, не повредит ли это формату JSON?)
Итак, мне нужно отправить SQL-запрос в СУБД в фоновом режиме и переодически (например раз в секунду) посылая эти нули в браузер(?), делая flush() и проверяя connection_status() как-то сканировать состояние-ход выполнения SQL запроса в MySQL. Если состояние запроса — «готов» — выходить из цикла и приступить к передаче результатов из СУБД в браузер. Если connection_status не 0, прибить запрос в MySQL и завершить скрипт.
Попробовал это сделать с помощью mysql_unbuffered_query и mysql_thread_id — не вышло — похоже mysql_unbuffered_query блокирует работу до получения первой строки результата ( а запросы бывают SELECT COUNT(*) ). К тому же не нашёл удобный способ проверять состояние запорса по id.

Итак — остаётся только mysql::query с MYSQLI_ASYNC — mysqli_poll ?? Есть предложения по-проще?
Вариант решения — А может можно использовать register_tick_function или thread, посылающий нули только во время выполнения mysql_query, выключив ignore_user_abort (что бы скрипт сумел завершится аварийно с надеждой, что соединение-запрос MySQL прибъётся при этом автоматически) ?

Есть ли какие-то мысли, комментарии?
php ассинхронно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.