[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разорвать соединение
LRCenter
Возможно ли принудительно разорвать соединение с клиентом из скрипта?

exit() не подойдет, речь идет именно о разрыве соединения, а не о прекращении работы сценария.

Среди функций управления соединением ничего похожего не нашел.
http://www.php.su/phphttp/?connhandling

_____________
Меньше кода - меньше багов ©
Hello
Можно если используешь php-fpm
В нём есть функция для этого - fastcgi_finish_request(); После неё соединение прерывается, но скрипт продолжает выполняться.

_____________
VPS от 5$, первые 2 месяца - бесплатно.
Rand
ob_start();

echo '[' . date('h:i:s') . '] Соединение закрыто';

header("Connection: close");
header('Content-Length: ' . ob_get_length());

ob_end_flush();
flush();

sleep(10);
file_put_contents('test.txt', 'Скрипт продолжил работу и записал этот текст в ' . date('h:i:s'));
P.S. используй php.net, там есть комментарии.
LRCenter
Rand
Спасибо, а без хинта с буферизацией видимо никак?
Жаль что нет стандартной функции.

Hello
К сожалению, я использую версию php без php-fpm.

_____________
Меньше кода - меньше багов ©
Rand
Можно без буферезации, если сможешь сам Content-Length посчитать:
<?
header("Connection: close");
header('Content-Length: 29');

echo '[' . date('h:i:s') . '] Соединение закрыто';
flush();

sleep(10);
file_put_contents('test.txt', 'Скрипт продолжил работу и записал этот текст в ' . date('h:i:s'));

LRCenter
А зачем нужен этот заголовок?

header('Content-Length: 29');


А этот способ будет работать в любом браузере/агенте?

Например роботы поисковиков не смогут увидеть контент после заголовка с командой разрыва?

_____________
Меньше кода - меньше багов ©
Rand
Цитата
А зачем нужен этот заголовок?

Данный заголовок указывает на размер данных содержащихся в теле ответа сервера.

Цитата (LRCenter @ 20.12.2012 - 15:57)
А этот способ будет работать в любом браузере/агенте?

В Хроме работает, про ПС не знаю, теоретически, всё что соблюдает стандарты HTTP должно работать нормально
LRCenter
Цитата
Данный заголовок указывает на размер данных содержащихся в теле ответа сервера.


Это понятно, я хотел спросить зачем его указывать принудительно?

_____________
Меньше кода - меньше багов ©
Rand
Цитата (LRCenter @ 20.12.2012 - 16:47)
Это понятно, я хотел спросить зачем его указывать принудительно?

Могу ошибатся, но скорее всего веб-сервер будет ждать завершения работы скрипта, чтобы отправить данный заголовок автоматом.
neadekvat
LRCenter, обрисуй задачу шире, возможно, есть другие пути решения. Например, из скрипта, к которому обращаются из браузера, запустить в фоне другой скрипт. Соответственно, этот умрет, а в фоне - будет жить.
Hello
Цитата (LRCenter @ 20.12.2012 - 13:47)
Цитата
Данный заголовок указывает на размер данных содержащихся в теле ответа сервера.


Это понятно, я хотел спросить зачем его указывать принудительно?

Чтобы клиент знал когда конец тела ответа.
Клиент посылает аналогичный заголовок, когда посылает POST запрос, и сервер понимает где конец запроса.

_____________
VPS от 5$, первые 2 месяца - бесплатно.
LRCenter
neadekvat

Да я над этим думал.

Если вы говорите про exec() или system(), то это интересное решение, но к сожалению работает только под линуксом.

Вот если-бы под виндой и линуксом работало.

_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.