Может ли PHP-скрипт обмануть браузер, считая, что HTTP-запрос завершен?

Сначала я сконфигурировал свой сценарий для запуска даже после завершения HTTP-запроса

ignore_user_abort(true); 

затем очистите текст.

  echo "Thats all folks!"; flush(); 

Теперь, как я могу обмануть браузер, думая, что HTTP-запрос завершен? поэтому я могу продолжать выполнять свою собственную работу без браузера, показывая «загрузка страницы».

  header(??) // something like this? 

Solutions Collecting From Web of "Может ли PHP-скрипт обмануть браузер, считая, что HTTP-запрос завершен?"

Вот как это сделать. Вы указываете браузеру читать первые 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 , но не закрывающих тегов в настоящее время. Он не позволяет сценарию отправлять какие-либо заголовки преждевременно, поскольку некоторые из них могут быть рассмотрены.