Прервать выполнение запроса к MSSQL при закрытии браузера
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Прервать выполнение запроса к MSSQL при... Expand / Collapse
Автор
Сообщение
28.03.2005 12:44
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.04.2005 16:12
Сообщ.: 5, Visits: 56
Может, вопрос глупый, но проблема такая: есть скрипт, с которого запускается очень длительный запрос к 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;
}
Не работает. Заранее спасибо.
Сообщ. #863266
28.03.2005 13:08
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Если я правильно понимаю проблему, то никак. Раз запрос выполняется очень долго, значит скрипт "висит" на строке
$rs = $engine->dba_usr->exec($query);
и в этот момент код PHP всего-лишь ждет ответа от БД, а скрипт не выполняется. Надо искать какой-то способ асинхронного выполнения запросов. Как это сделать в PHP я не знаю.
Сообщ. #863271
28.03.2005 13:55
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.04.2005 16:12
Сообщ.: 5, Visits: 56
Вариант
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.
Сообщ. #863276
28.03.2005 18:10
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.03.2007 17:56
Сообщ.: 637, Visits: 7 022
А if (connection_status()!=0) не помогает?
Сообщ. #863320
30.03.2005 15:19
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 07.04.2005 16:12
Сообщ.: 5, Visits: 56
Нет, не работает. Но все равно спасибо.
Сообщ. #863562
09.11.2006 11:25
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 09.11.2006 11:23
Сообщ.: 1, Visits: 1
Задался той же проблемой, нашёл решение:
1. после соединения с базой данных определяем @@SPID процесса и заносим его в COOKIE
2. в теле страницы, после закрытия которой завершаем процесс создаём скрипт:

<script>

var UserClicked=false;

document.onkeydown = checkKey;
document.onmousedown = checkKey;

function checkKey()
{
   UserClicked=true;
   setTimeout("UserClicked=false",2000);
}

function popup()
{
  if(!UserClicked)
 {
   var win=window.open("","","width=300,height=300")
                  win.location.href="scripts/kill.php";
 }
}
window.onunload=popup;

</script>

3. собственно скрипт kill.php


<?
$spid=$_COOKIE['spid'];

$link_new=mssql_connect($serv , $user , $pass);

mssql_query("kill $spid", $link_new);

echo $spid;
echo '<br>Процесс завершен :)';
?>


Сообщ. #907113
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 12:10