Преждевременный вывод

pablobablo

Новичок
Преждевременный вывод

Всем привет! Подскажите решение, пожалуйста.

Есть некий PHP скрипт. Половина кода скрипта генерирует HTML страницу, а другая половина выполняет код, который ничего не выводит, но занимает достаточно долгое время. Задача состоит в том, чтобы скрипт выдал сгенерированную HTML страницу пользователю, но сам продолжил работать. Сейчас проблема в том, что пользователю приходиться ждать пока фоновая задача обработается и только потом выдается HTML страница и браузеру сообщается о завершении загрузки страницы.
 

pablobablo

Новичок
Функция flush не помогает.

Проверил. Если сделать так:
PHP:
<?php

	echo str_repeat("OUTPUT\r\n", 200);
	flush();
	sleep(25);
	
?>
То, все равно 25 секунд браузер ждет.
 

fixxxer

К.О.
Партнер клуба
http://phpclub.ru/talk/showthread.php?s=&threadid=119458

-~{}~ 17.07.10 03:05:

В комбинации nginx-apache_modphp можно попробовать так

PHP:
ob_start();
// код всякий там
$length = ob_get_length();
header('Content-Length: ' . $length);
ob_end_flush();
// делаем всякое там длительное
С fastcgi надо использовать php-fpm и его fastcgi_finish_request().
 

С.

Продвинутый новичок
pablobablo, надежного "прямого" способа нет. Надо просто разнести выдачу предварительной страницы и вычисление (frame, iframe, ajax)
 

pablobablo

Новичок
Да, пришлось делить скрипт на два. В конце первого запускаю второй с помощью stream_socket_client и fwrite. Пока лучшего решения не нашел.

Странно, что в PHP нет стандартных средств для подобных задач...
 

newARTix

Новичок
а это разве не стандартное средство? :)
просто задача специфическая и средство ее решения очень зависит от необходимого результата. И это не столько проблема PHP, сколько всего используемого инструментария: nginx, apache, http... нет решения которое бы устраивало всех.
fixxxer привел соответствующие решения для разных окружений.
А так, конечно, жаль что PHP не носит кофе в постель :(
 

С.

Продвинутый новичок
В конце первого запускаю второй с помощью stream_socket_client и fwrite. Пока лучшего решения не нашел.
Я предложил три простых варианта, а ты воспользовался четвертым, самым сложным и замороченным. Ну да бешеной корове семь верст не круг.
 
Сверху