Прервать выполнение запроса к 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;
}
Не работает. Заранее спасибо.
 
я, конечно, с трудом себе представляю запрос, который может выполняться полчаса, но в любом случае, ТАКОЕ надо делать скриптом, запущенным независимо от веб-сервера, а юзера рефрешить раз в полминуты-минуту, пока не появится флажок готовности
 
Запрос выполняет обработку здоровых таблиц (делает отчеты).Не совсем понял, что значит "независимо от веб-сервера?". К тому же, почему вариант
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 возвращает неправильное значение?
 
1) браузер не обязан держать соединение в течение часа. он может и по таймауту слететь. а если юзер сидит через прокси - 99% слетит. так что забудь и делай как тебе говорят :)
2) не выводя ничего в браузер, никакого connection_aborted ты определить не сможешь, это же очевидно.
 
"так что забудь и делай как тебе говорят" - это как?
 
ну, например.
стартуем сессию, знаем session_id.
из твоего скрипта пишем session_id и все нужные параметры, скажем, в табличку queue.
ставим поле status=0.
по крону регулярно (ну, скажем, раз в минуту) пускаем скрипт, который ищет в этой табличке незапущенные запросы, ставит status=1 и запускает еще один скрипт, который выполняет этот запрос и, выполнив, ставит status=2 и сохраняет результаты выполнения.
твой скрипт рефрешится раз в 30 секунд, смотрит значение status, если status=2, выводит результаты выполнения и вычищает уже не нужные сохраненные данные (если они не нужны).
что-то в этом роде.
 
Спасибо. Хотя мрачновато, бр-р-р. Хе, если другого не придумаю, вот человек обрадуется, которому все это прийдется переделывать.

-~{}~ 28.03.05 13:56:

Люди добрые, может, есть другие предложения?
 
$rs = $engine->dba_usr->exec($query);
if (connection_aborted())
{
$engine->dba_usr->disconnect();
exit;
}

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

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

1. Разбей запрос на более мелкие части, которые будут выполняться секунд по 30 (например)
2. Выполняй по одному запросы в цикле примерного вида while(!connection_aborted())
 
Я писал :
$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
 
Сверху