|
|
|
новичок
      
участник
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; } Не работает. Заранее спасибо.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
Если я правильно понимаю проблему, то никак. Раз запрос выполняется очень долго, значит скрипт "висит" на строке $rs = $engine->dba_usr->exec($query); и в этот момент код PHP всего-лишь ждет ответа от БД, а скрипт не выполняется. Надо искать какой-то способ асинхронного выполнения запросов. Как это сделать в PHP я не знаю.
|
|
|
|
|
новичок
      
участник
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.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 14.03.2007 17:56
Сообщ.: 637,
Visits: 7 022
|
|
| А if (connection_status()!=0) не помогает?
|
|
|
|
|
новичок
      
участник
Last Login: 07.04.2005 16:12
Сообщ.: 5,
Visits: 56
|
|
| Нет, не работает. Но все равно спасибо.
|
|
|
|
|
новичок
      
участник
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>Процесс завершен :)'; ?>
|
|
|
|