webew
Войти » Регистрация
 
PHP

Завершение работы скрипта при отключении клиента

26 ноября 2011, 23:01
Автор: meganosets
Пользователь из браузера запускает скрипт, если пользователь не дождался окончания работы скрипта и например закрыл окно браузера, то необходимо остановить скрипт.
Это возможно реализовать ?

В мануале пишут : По умолчанию скрипт завершает свою работу при отключении клиента. http://www.php.net/manual/ru/features.connection-handling.php

Но в практике это так не работает.
Проверяю таким образом.
<?php
error_log("start");
sleep(20);
error_log("end");
?>

Запускаю скрипт и сразу отключаю. В логе получаю "end" спустя 20 сек.

Пробовал устанавливать ignore_user_abort(false);
А также проверять с помощью connection_aborted() и connection_status()
Ничего не помогает ... Скрипт не видит отключение клиента.
Проверял на разных версиях php, под windows и linux. Всё под apache.

Пожалуйста подскажите, что можно сделать.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

rgbeast

Тоже перепробовал обсуждаемые варианты, ничего не получилось. Видимо дело в apache + mod_php. Попробуйте подключить php через cgi или использовать lighttpd + fastcgi.
27.11.2011, 00:06
Ответить

paulus

Давайте напишу свои соображения :)

1. Автоматического хорошего способа «через вебсервер» нету: мы вынуждены использовать
встроенные в PHP средства;
2. http://php.net/manual/en/function.ignore-user-abort.php — это единственная правильная точка
входа в документации PHP. По умолчанию, насколько я понимаю, abort включен (т.е. должно
делаться то, что нам нужно);
3. Для того, чтобы делалось то, что нам нужно, нам нужно периодически посылать что-то на
клиент вместе с flush (см. notes и комментарии к странице из пункта 2);
4. sleep — самая неудачная функция для этого теста, потому что она уходит в сисколл в php и
вообще никак ничего никогда не отслеживает (подробнее есть в тех же комментариях).

Как сделать правильно на нефоркающемся PHP — не представляю. Возможно, нужно будет пере-
делывать структуру в целом (например, генерировать отчет во временный файлик, а со стороны
клиента периодически поллить независимо через AJAX).
27.11.2011, 12:19
Ответить

paulus

Во, нашел постик Пети Зайцева:
http://www.mysqlperformanceblog.com/2008/05/20/apache-php-mysql-and-runaway-scripts/
Текста его программ не видно, но он нашел системные таймеры для периодического
полла клиента на живость: http://ru2.php.net/pcntl_alarm
27.11.2011, 12:31
Ответить
NO USERPIC

rgbeast

Пробовал echo + flush, при этом sleep заменил на долгий пустой цикл, но все равно не получилось.
27.11.2011, 12:47
Ответить
NO USERPIC

meganosets

Спасибо, буду пробовать.
05.12.2011, 14:16
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100