Нет асинхронных вызовов mysql и нет возможности для разветвления легких потоков.
Хотя вы можете разделить свой PHP-код на два уровня и использовать соединение между ними, которое вы можете вызывать асинхронно, проблема с этим подходом заключается в том, что уровень БД все еще будет пытаться выполнить запрос после того, как верхний уровень прекратил получать результаты обратно - потенциально блокирование СУБД для других пользователей. (вы чаще будете получать запросы на страницы, время которых истекло).
У вас возникнет та же проблема, если вы увеличите время ожидания в обратном прокси-сервере, расположенном перед веб-сервером.
Самым разумным местом для реализации тайм-аута является сама база данных - но AFAIK, mysql не поддерживает это.
Таким образом, следующая опция - создание прокси между PHP и базой данных - это может быть автономно - генерирование 2 облегченных потоков для каждого запроса (1 для запуска запроса, 2-й в качестве сторожевого таймера для уничтожения первого, если он требует слишком много времени) длинный) - но это требует не только написания кода в языке, поддерживающем легкие потоки, но и определения протокола для связи с PHP.
Однако, принимая другой подход к модели прокси - вы можете порождать отдельный процесс PHP с помощью proc_open и установить поток stdout как неблокирующий - таким образом ваш PHP может продолжать работать и проверять, запущен ли прокси запрос. Если время ожидания истекло, то в качестве родителя прокси-сервера он может сигнализировать об отключении (proc_terminate ()), что должно остановить выполнение запроса в базе данных.
Конечно, это будет означать большую работу по разработке.
Может оказаться намного проще настроить одну или несколько подчиненных СУБД для выполнения ваших медленных запросов - возможно, с интеллектуальной балансировкой нагрузки. Или посмотрите другие способы ускорения медленных запросов - например, предварительную консолидацию.
НТН
С