Проблема: Если во время выполнения долгого запроса через 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 прибъётся при этом автоматически) ?