PHP. Выполнение скрипта на фоне или аналоги

Доброго времени суток. Задача — сформировать и отдать ответ браузеру, закрыв с ним соединение, после чего продолжить выполнение скрипта. Вроде бы след.код должен работать:

ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
ignore_user_abort( true ); // optional
ob_start();
echo ('Text user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
ob_end_clean();

//do processing here
sleep(10);
echo('Text user will never see');

Локально работает, но на сервере (не вирт.хостинг, есть возможность править конфиги) — нет. Проблема заключается в следующем — связь с браузером не разрывается. Т.е. в приведённом примере пользователю всё так же придётся ждать 10 секунд, но 'Text user will never see' он не увидит. В чём загвоздка? Какие параметры в php.ini следует изменить?

P.S. local — Ubuntu 11.04, PHP 5.3.5-1ubuntu7.3; online — Debian, PHP 5.2.6-1+lenny9
  • Вопрос задан
  • 9267 просмотров
Решения вопроса 1
Комментировать
Пригласить эксперта
Ответы на вопрос 6
@werdender
А в каком месте у вас тут «связь с браузером разрывается»?
Пишите в сокет, запуская другой скрипт, и будет вам счастье.
Ответ написан
taliban
@taliban
php программист
почему бы Вам форм не попробовать вместо этого?
Ответ написан
Честно говоря, я уже немного подзабыл пхп, но если мне изменяет память при разрыве соединения апач\другой вэб сервер убьет поток с пхп скриптом. По крайней мере при настройках по-умолчанию. Я намекаю на то, что если вы и найдете способ убить соединение, то уверены ли вы что Апач не убьет ваш скрипт?

Если вам нужно сделать асинхронную обработку, вставьте в конец страницы невидимый img, а src ему ссылку на скрипт. Страница будет загружена, пользователь доволен а обработка пойдет в фоне. Но тут нет гарантии, что пользователь не закроет браузер пока ваша обработка не кончится (картинка не «загрузится»). Можете ему прогресс бар какой аяксом показывать. (Один скрипт, на который ссылка в картинке, пилит что-то в фоне и пишет прогресс в базу, другой его пользователю по аяксу отдает). А вообще все эти серверные обработки на PHP вещь неблагодатная. Лучше всего заведите табличку, в которую пишите все что надо асинхронно выполнить, и пусть каждые 10 секунд по cron на сервере запускается тот же php (хотябы через wget специального урла) и делает все асинхронное. Последнее решение наиболее стабильное. И избавляет от необходимость держать открытым браузер.
Ответ написан
Комментировать
lashtal
@lashtal
www.php.net/manual/en/features.connection-handling.php
В комментах говорят, для того, чтобы disconnect the browser and then continue processing:

header(«Content-Length: 0»);
header(«Connection: close»);
flush();

// browser should disconnect at this point
Ответ написан
Zyava
@Zyava
А так тоже не работает?
set_time_limit(0);
ignore_user_abort(true);
header("Connection: close");
ob_flush();
flush();
// do processing here
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы