Есть система генерации отчетов. Пользователь выбирает параметры отчета (фильтры и прочее) и отправляет форму с помощью Ajax.
Есть кнопка "Отменить", при нажатии на которую происходит обрыв соединения с сервером (Jquery.abort()).
При нажатии на нее, скрипт завершается и на сервере вызывается shutdownHandler.
В этой функции я проверяю, если соединение было прервано пользователем, то закрываю все открытые к разным БД соединения:
function scriptShutdownHandler()
{
if (connection_aborted()) {
Fw_Db_Factory::closeConnections(); // здесь для каждого соединения вызывается mysql_close.
}
}
Во время построение отчета набираю в консоли mysql:
SHOW PROCESSLIST;
+-----+-----------+-----------+---------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-----------+-----------+---------------+---------+------+-------+------------------+
| 53 | root | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST |
| 177 | reporting | localhost | settings | Sleep | 5 | | NULL |
| 178 | reporting | localhost | datawarehouse | Sleep | 3 | | NULL |
| 179 | reporting | localhost | datawarehouse | Sleep | 3 | | NULL |
+-----+-----------+-----------+---------------+---------+------+-------+------------------+
Вижу, что открыты соединения с этого скрипта к БД, еще секунд 5 (время генерации этого отчета).
Т.е. похоже на то, что закрытие соединений из PHP не работает.
Хотелось бы посоветоваться с более опытными в этом вопросе людьми, как лучше завершить выполнение запроса MySQL?
Спустя 12 минут, 26 секунд (22.12.2010 - 16:10) Basili4 написал(а):
mysql_close. помоему это закрывает соединение с сервером а не запрос mysql_free_result осовбождает ресурс и возможно будет более логичным использовать его.
Спустя 6 минут, 53 секунды (22.12.2010 - 16:17) elliot написал(а):
Цитата (Basili4 @ 22.12.2010 - 13:10) |
mysql_close. помоему это закрывает соединение с сервером а не запрос mysql_free_result осовбождает ресурс и возможно будет более логичным использовать его. |
Да, mysql_close закрывает соединение с сервером MySQL.
mysql_free_result - параметр функции - это резултаты выполнения mysql_query. В моем случае запрос отправлен на сервер MySQL, но результаты еще не вернулись.
Эта функция очищает память, выделенную под вернувшиеся результаты SQL запроса.
Спустя 1 час, 40 минут, 30 секунд (22.12.2010 - 17:57) Basili4 написал(а):
elliot
не перервешь ни как пых только посылает запросы и ждет результаты ты можешь что хочешь делать обработку после отправки не прервать.
не перервешь ни как пых только посылает запросы и ждет результаты ты можешь что хочешь делать обработку после отправки не прервать.
Спустя 2 часа, 31 минута, 26 секунд (22.12.2010 - 20:29) elliot написал(а):
Можно с помощью mysql_thread_id() получить id потока и затем убить его через kill, но это слишком грубо (