Jump to content
  • 0

Работа php скрипта после обрыва соединения со стороны пользователя


CoDy
 Share

Question

Всем привет...

На днях обнаружил интересную особенность работы PHP.

Допустим есть некий скрипт, который может выполняться относительно долго. Если в браузере, после запуска скрипта прервать сединение(кнопка стоп в браузере), то скрипт не отпадает, а продолжает работать дальше в штатном режиме.

Вот искусственное симулирование подобной ситуации:

<?php

header('Content-Type:text/html;charset=UTF-8', true);
error_reporting(-1);
$fileName = 'log_file.log';


if ( !empty($_GET['work_time']) ) {
set_time_limit((int)$_GET['work_time']);
$startTime = time();
$i = 1;

while ( true ) {
$fileHandler = fopen($fileName, 'a');

$workingTime = time() - $startTime;
fwrite($fileHandler, "$i: working time $workingTime seceond\n");

fclose($fileHandler);

++$i;

echo '_';

sleep(1);
}
} elseif ( !empty($_GET['get_log']) ) {
set_time_limit(2);

if ( file_exists($fileName) ) {
while ( !is_writable($fileName) ) {
usleep(500000);
}

$content = file($fileName);

echo '<pre>', implode('', array_reverse($content)), '</pre>';
} else {
echo 'файл отсутствует';
}
} else {
$path = parse_url($_SERVER['REQUEST_URI']);
$path = $path['path'];
?>
<p>Указать время в терении которого будет работать скрипт, даже если заррыть соединение.</p>
<form action="">
<fieldset>
<label for="work_time" title="">Время работы скрипта</label>
<input type="text" name="work_time" id="work_time" value="10" />
<input type="submit" value="Отправить" />
</fieldset>
</form>
<a href="<?php echo $path;?>?get_log=1" title="s">Посмотреть лог</a>
<?php
}

Запускаем скрипт, указываем в поле ввода время в течении которого будет работать скрипт, отправляем форму на сервер. Скрипт начинает в цикле запись в файл, пока не превысит время работы указанное в форме.

После того как браузер начал ожидание ответа, открываем в новом окне ссылку ''Посмотреть лог". В открывшемся окне постоянно жмем обновить и видим содержимое файла в который идет запись.

Если вернуться к первому окну, остановить ожидание ответа и вернуться к просмотру содержимого файла, то видим что скрипт не остановился, а продолжает работать.

Вот не могу понять почему так происходит, хотя тут написано мануал, что скрипт должен оборваться.

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

эээ... так сервер не может знать текущее состояние коннекта с клиентом В ПРИНЦИПЕ. Только в момент поступления запроса (гет/пост) сервер знает о том что клиент вообще существует.

этот мануал дотошно не курил, но таки давно знал что скрипт сам не остановиться пока тайм-лимит из конфига (30 сек) не истечет или не будет готов результат для ответа или использована конструкция die(). несколько удивлён вопросом вашим.

Link to comment
Share on other sites

  • 0

Я просто раньше не над этим как-то вообще не задумывался.

Наткнулся на это, когда пытался одновременно на сервер отправлять несколько асинхронных запросов из под JS на клиенте, причем скрипты-обработчики XHR запросов активно юзали сессионные данные.

И оказалось, что ни браузер, ни сам стандартный механизм поддержки сессий в PHP в принципе не позволяют реализовать параллельное выполнение скриптов, которые стартуют сессию.

Пока разбирался как это обойти это ограничение, открыл для себя такую особенность работы PHP после обрыва соединения. И на самом деле очень был удивлен таким поведением. Поскольку, допустим есть некий скрипт время работы которого может затянуться на долго и поэтому сознательно снимаем ограничение на время выполнения. И если по какой-то причине нужно прервать его работу, то простой оборыв соединение в браузере не даст нужного эффекта.

Именно поэтому решил обратиться с таким вопросом. Просто хочу прояснить для себя эту ситуацию, чтобы иметь ввиду на будущее.

Почему-то кажется, что это все как-то решается тонкой настройкой PHP.

Link to comment
Share on other sites

  • 0

Именно поэтому решил обратиться с таким вопросом. Просто хочу прояснить для себя эту ситуацию, чтобы иметь ввиду на будущее.

Почему-то кажется, что это все как-то решается тонкой настройкой PHP.

Ничего тонкого в этом не вижу.

в php.ini ищём строки

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30

в секундах ставим предел.

Edited by Быколай
Link to comment
Share on other sites

  • 0

А с каким вопросом обратился? Как прервать скрипт? Ну сделай ссылку, по которой будет создаваться файл-флаг, который и прервёт выполнение скрипта. Правда, если это будет какой-то тяжёлый запрос к базе, который и будет вешать скрипт, то ничего не получится.

Link to comment
Share on other sites

  • 0

А с каким вопросом обратился?

Вопрос: "Запущенный из браузера PHP скрипт 'отпадает' исключительно по таймауту и при завершении работы; и нажатие кнопки стоп никак не может на него повлиять??".

Все дело в том, что это противоречит мануалу.

Тем более, что в PHP есть средства для управления и мониторинга соединения:

функции connection_aborted(), connection_status(), ignore_user_abort ();

конфиг параметр ignore_user_abort(который по умолчанию off);

константы: CONNECTION_NORMAL, CONNECTION_TIMEOUT,CONNECTION_ABORTED.

Примеры которые , приведены в мануалах не работают так, как там написано.

Edited by CoDy
Link to comment
Share on other sites

  • 0

По ссылке, вероятно, речь идёт и подключении php модулем апача, а вот с cgi такая фишка не прокатит, поскольку в этом случае php вообще не знает, кто его вызвал.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy