Закройте соединение в PHP, но продолжайте выполнять скрипт - PullRequest
4 голосов
/ 17 июля 2010

Кто-нибудь знает, как закрыть соединение (кроме flush()?), Но после этого продолжайте выполнять некоторый код.

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

Ответы [ 5 ]

9 голосов
/ 17 июля 2010

Возможно, вы захотите взглянуть на pcntl_fork() - он позволяет вам форкнуть ваш текущий скрипт и запустить его в отдельном потоке.

Я использовал его в проекте, гдеПользователь загружает файл, а затем скрипт выполняет над ним различные операции, в том числе общение со сторонним сервером, что может занять много времени.После первоначальной загрузки сценарий разветвился и отобразил следующую страницу для пользователя, а родительский самоуничтожился.Затем дочерний процесс продолжил выполнение, и возвращаемая страница запросила его состояние с помощью AJAX.это сделало приложение намного более отзывчивым, и пользователь получил обратную связь относительно статуса во время его выполнения.

Эта ссылка содержит больше информации о том, как его использовать:

Если вы не можете использовать pcntl_fork, вы всегда можете быстро вернуться к страницекоторый запускает AJAX-запрос на выполнение большего количества элементов из очереди.


mvds напоминает следующее (которое может применяться в конкретной конфигурации сервера): Не fork всего веб-сервера Apache, но вместо этого запускайте отдельный процесс.Пусть этот процесс раскроет ребенка, который живет дальше.Ищите proc_open, чтобы получить полное взаимодействие между вашим php-скриптом и процессом.

5 голосов
/ 17 июля 2010

Я не хочу, чтобы клиент видел длительный процесс, который может произойти после того, как страница завершена.

к сожалению, страница не завершена до после длинный процесс завершен - следовательно, то, что вы просите, невозможно ( реализовать так, как вы делаете вывод ) Боюсь.

Ключ здесь, на который указывает ответ Чонгаи наоборот, в комментарии Анимусена говорится, что весь смысл того, что мы делаем с HTTP как веб-разработчиками, заключается в том, чтобы отвечать на запрос как можно быстрее / end - вот и все, так что если вы делаете что-то еще, то это указывает накакое-то дизайнерское решение, которое, возможно, могло бы быть немного лучше:)

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

Точное решение зависит от того, что вы делаете, и ответ на дифразличные вопросы;но для этого все сводится к следующему: нет, вы не можете закрыть соединение, и вам бы посоветовали взглянуть на рефакторинг длительного процесса из этого скрипта / страницы.

4 голосов
/ 17 июля 2010

Взгляните на PHP ignore_user_abort -setting . Вы можете установить его, используя функцию ignore_user_abort() .

пример (необязательного) использования был приведен (и было сообщено, что он работает OP) в следующем дублирующем вопросе:

В основном, это ссылка на примечания пользователя в руководстве по PHP. Центральный -

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

3 голосов
/ 17 июля 2010

Не fork весь веб-сервер apache, но вместо этого запускайте отдельный процесс.Пусть этот процесс раскроет ребенка, который живет дальше.Ищите proc_open, чтобы получить полное взаимодействие между вашим php-скриптом и процессом.

2 голосов
/ 17 июля 2010

Мы решили эту проблему, вставив работу, которую необходимо выполнить, в очередь заданий, и затем cron-скрипт регулярно выбирал бэкэнд-задания. Вероятно, не совсем то, что вам нужно, но оно очень хорошо работает для процессов, интенсивно использующих данные.

(вы также можете использовать очередь заданий Zend Server, если у вас есть куча денег и вы хотите испытанное и проверенное решение)

...