Сначала я сконфигурировал свой сценарий для запуска даже после завершения HTTP-запроса
ignore_user_abort(true);
затем очистите текст.
echo "Thats all folks!"; flush();
Теперь, как я могу обмануть браузер, думая, что HTTP-запрос завершен? поэтому я могу продолжать выполнять свою собственную работу без браузера, показывая «загрузка страницы».
header(??) // something like this?
Вот как это сделать. Вы указываете браузеру читать первые N символов вывода, а затем закрывать соединение, пока ваш скрипт продолжает работать, пока это не будет выполнено.
<?php ob_end_clean(); header("Connection: close"); ignore_user_abort(true); // optional ob_start(); echo ('Text the user will see'); $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); // Will not work flush(); // Unless both are called ! // At this point, the browser has closed connection to the web server // Do processing here echo('Text user will never see'); ?>
Заголовки не будут работать (они являются заголовками, поэтому они на первом месте )
Я не знаю, как закрыть http-соединение, не прерывая сценарий, хотя я предполагаю, что есть какой-то неясный способ сделать это.
Рассказывая нам о том, что вы хотите сделать после того, как запрос будет выполнен, мы сможем дать лучшие предложения.
Но в целом, я бы подумал об одном из следующих:
1) Выполните какой-то простой скрипт командной строки (используя exec ()), который выглядит так:
#!/bin/sh php myscript.php <arg1> <arg2> .. <argN> &
Тогда ударьте это от вашего связанного с http скрипта как:
<?PHP exec('/path/to/my/script.sh'); ?>
Или:
2) Напишите другую программу (возможно, непрерывный демон или просто какой-то скрипт, который так часто бывает), и выясните, как ваш код в запросе может передать ему инструкции. У вас может быть таблица базы данных, в которой работает очередь, или попытайтесь заставить ее работать с каким-то плоским файлом. Вы также можете заставить свой веб-скрипт вызывать некоторую команду командной строки, из-за чего ваш скрипт вне очереди запрашивает некоторую работу.
В конце концов, вы не хотите, чтобы ваш скрипт продолжал выполнение после HTTP-запроса. Предполагая, что вы используете mod_php, это означает, что вы будете связывать процесс apache, пока скрипт не завершится.
Возможно, этот конкретный комментарий на странице руководства php.net поможет: http://www.php.net/manual/en/features.connection-handling.php#71172
Теоретически, если HTTP 1.1 keep-alive включен и клиент получает количество символов, которое он ожидает от сервера, он должен рассматривать его как конец ответа и идти вперед и отображать страницу (сохраняя соединение еще открытым). Попробуйте отправить эти заголовки (если вы не можете включить их другим способом):
Подключение: сохранить жизнь Content-Length: n
Где n
– количество символов, которое вы отправили в тело ответа (буферизация вывода может помочь вам подсчитать это.) Мне жаль, что у меня нет времени, чтобы проверить это сам. Я просто бросаю предложение, если оно работает.
Лучший способ добиться этого – использовать буферизацию вывода. PHP отправляет заголовки, когда он хорош и готов, но если вы завершаете вывод в браузер с помощью ob_ *, вы можете управлять заголовками на каждом шагу.
Вы можете держать отображаемую страницу в буфере, если хотите, и отправлять заголовки, пока солнце не появится в Китае. Эта практика заключается в том, что вы можете увидеть много открывающих тегов <?php
, но не закрывающих тегов в настоящее время. Он не позволяет сценарию отправлять какие-либо заголовки преждевременно, поскольку некоторые из них могут быть рассмотрены.