Прервать выполнение запроса к MSSQL при закрытии браузера

  • Автор темы maxim_march
  • Дата начала

maxim_march

Guest
Прервать выполнение запроса к MSSQL при закрытии браузера

Может, вопрос глупый, но проблема такая: есть скрипт, с которого запускается очень длительный запрос к MSSQL (может выполняться до 10-30 минут). У пользователя в это время "висит" надпись "Подождите" и есть кнопка "Отмена", которая выполняет закрытие окна браузера. Вопрос: как реализовать прекращение выполнения скрипта? Пробывал вот так:
set_time_limit(0);
ignore_user_abort(true);
$query = "EXEC MakeReportTurnoverByCountry $im_ex, '$rc_periods', '$rc_countries', '$rc_delivery_tems'";
$rs = $engine->dba_usr->exec($query);
if (connection_aborted())
{
$engine->dba_usr->disconnect();
exit;
}
Не работает. Заранее спасибо.
 

fixxxer

К.О.
Партнер клуба
я, конечно, с трудом себе представляю запрос, который может выполняться полчаса, но в любом случае, ТАКОЕ надо делать скриптом, запущенным независимо от веб-сервера, а юзера рефрешить раз в полминуты-минуту, пока не появится флажок готовности
 

maxim_march

Guest
Запрос выполняет обработку здоровых таблиц (делает отчеты).Не совсем понял, что значит "независимо от веб-сервера?". К тому же, почему вариант
set_time_limit(0);
ignore_user_abort(true);
$query = "EXEC MakeReportTurnoverByCountry $im_ex, '$rc_periods', '$rc_countries', '$rc_delivery_tems'";
$rs = $engine->dba_usr->exec($query);
$engine->dba_usr->disconnect();
exit;
прерывает выполнение запроса? Функция connection_aborted возвращает неправильное значение?
 

fixxxer

К.О.
Партнер клуба
1) браузер не обязан держать соединение в течение часа. он может и по таймауту слететь. а если юзер сидит через прокси - 99% слетит. так что забудь и делай как тебе говорят :)
2) не выводя ничего в браузер, никакого connection_aborted ты определить не сможешь, это же очевидно.
 

maxim_march

Guest
"так что забудь и делай как тебе говорят" - это как?
 

fixxxer

К.О.
Партнер клуба
ну, например.
стартуем сессию, знаем session_id.
из твоего скрипта пишем session_id и все нужные параметры, скажем, в табличку queue.
ставим поле status=0.
по крону регулярно (ну, скажем, раз в минуту) пускаем скрипт, который ищет в этой табличке незапущенные запросы, ставит status=1 и запускает еще один скрипт, который выполняет этот запрос и, выполнив, ставит status=2 и сохраняет результаты выполнения.
твой скрипт рефрешится раз в 30 секунд, смотрит значение status, если status=2, выводит результаты выполнения и вычищает уже не нужные сохраненные данные (если они не нужны).
что-то в этом роде.
 

maxim_march

Guest
Спасибо. Хотя мрачновато, бр-р-р. Хе, если другого не придумаю, вот человек обрадуется, которому все это прийдется переделывать.

-~{}~ 28.03.05 13:56:

Люди добрые, может, есть другие предложения?
 

.::PhoenikS::.

Новичок
$rs = $engine->dba_usr->exec($query);
if (connection_aborted())
{
$engine->dba_usr->disconnect();
exit;
}

Насколько я шарю в колбасных обрезках, пхпх выполняется последовательно, т.е. пока не отработает твой exec() до проверки даже не дойдет дело.

Т.е. как вариант именно для твоего желания делать все по описанной схеме мне видится только один (хотя вообще это не совсем правильно, и fixxxer предлагает тебе более дельное решение):

1. Разбей запрос на более мелкие части, которые будут выполняться секунд по 30 (например)
2. Выполняй по одному запросы в цикле примерного вида while(!connection_aborted())
 

maxim_march

Guest
Я писал :
$query = "EXEC MakeReportTurnoverByCountry $im_ex, '$rc_periods', '$rc_countries', '$rc_delivery_tems'";
$rs = $engine->dba_usr->exec($query);
$engine->dba_usr->disconnect();
exit; - завершается сразу.
Почему? К тому же:
While(!Connection_Aborted())
{
Echo ".";
Flush();
Sleep(1);
}
$engine->dba_usr->disconnect();
exit;
вешает скрипт намертво. Т.е., не срабатывает connection_aborted(). Может, что-то с настройками PHP?

Да, забыл сказать, работа с базой идет через ODBC
 
Сверху