ignore_user_abort(TRUE); // Скрипт должен доработать даже если пользователь уйдет со страницы.
// Посетителя сразу же отправляем смотреть другую страницу:
header("Refresh: 0;url=".$url);
echo("<html><head><meta http-equiv='refresh' content='0; url=".$url."'></head><body></body></html>");
flush();
// Тут код, довольно долго перемолачивающий БД
exit();
Я
На практике, страница не отображается пока не домолотит длинный скрипт...
Если не дожидаясь конца молотилова скрипта открыть страницу в другом окне браузера - открывается мгновенно.
Спустя 38 минут, 6 секунд (6.07.2012 - 21:40) vital написал(а):
А почему бы не exec-ать длинный скрипт?
т.е. пользователь жмет кнопку типа запустить или чо там есть, смотрит дальше свою страницу. А на серв идет аякс запрос, а там exec\system.. че-нить в духе system('nohup php asd.php') - nohup что бы не ждать завершения скрипта.
т.е. пользователь жмет кнопку типа запустить или чо там есть, смотрит дальше свою страницу. А на серв идет аякс запрос, а там exec\system.. че-нить в духе system('nohup php asd.php') - nohup что бы не ждать завершения скрипта.
Спустя 3 минуты, 41 секунда (6.07.2012 - 21:44) vital написал(а):
Цитата |
страница не отображается пока не домолотит длинный скрипт... |
А это происходит потмоу, что для вывода данных на ходу одного flush() мало, мануал врет.
надо еще добавить как минимум ob_flush();
А еще поотключать в конфиге пхп все возможные буферы\кеши аля гзип и т.п.
Спустя 42 минуты, 44 секунды (6.07.2012 - 22:27) killer8080 написал(а):
Цитата (vital @ 6.07.2012 - 21:44) |
А это происходит потмоу, что для вывода данных на ходу одного flush() мало, мануал врет. |
Мануал не врет, flush() выплевывает буфер php, но не надо забывать, что кроме кеша php, еще есть буфер вебсервера (иногда двух, если связка), на пути еще может оказаться прокся, в которой то же есть буфер. Кроме того браузер то же буферизирует контент, перед рендерингом. Flush() никак не может на них повлиять. :)
Цитата (vital @ 6.07.2012 - 21:44) |
надо еще добавить как минимум ob_flush(); |
ob_flush() не имеет смысла, если не была запущена буферизация.
Цитата (vital @ 6.07.2012 - 21:44) |
А еще поотключать в конфиге пхп все возможные буферы\кеши аля гзип и т.п. |
а также отключить сжатие на вебсервере. У хостеров часто включено сжатие на фронтэнде.
FatCat
если нет возможности юзать вызов консольных команд из php, можно воспользоваться таким костылём
if($f = fsockopen('127.0.0.1', 80, $errn, $errs, 3)){
fwrite($f, "GET /script.php HTTP/1.0\r\nHost: ".$_SERVER['HTTP_HOST']."\r\n\r\n");
fclose($f);
}
соответственно в script.php помещаем "тяжелый" код.
Спустя 1 час, 49 минут, 4 секунды (7.07.2012 - 00:16) vital написал(а):
Цитата |
ob_flush() не имеет смысла, если не была запущена буферизация. |
Не совсем.
Проверьте

Где-то видел скрипты, где почему-то flush() сам по себе не выводил инфу без ob_flush().
На данный момент не могу проверить сам=(
Спустя 38 минут, 26 секунд (7.07.2012 - 00:54) FatCat написал(а):
Цитата (vital @ 6.07.2012 - 22:40) |
А почему бы не exec-ать длинный скрипт? |
Ищу решение, которое бы работало без настроек при использовании php-файла на любом хостинге.
Цитата (killer8080 @ 6.07.2012 - 23:27) |
можно воспользоваться таким костылём |
Хм... Спасибо за идею!
Костыль, правда, сделаю чуть иначе:
<img src="my_grosse_script.php" border="0" alt="">
Спустя 1 день, 9 часов, 7 минут, 37 секунд (8.07.2012 - 10:02) killer8080 написал(а):
Цитата (FatCat @ 7.07.2012 - 00:54) |
Костыль, правда, сделаю чуть иначе: |
У этого способа есть свои недостатки. Браузер будет ожидать картинку, и все это время будет отображаться, что страница еще грузиться. Плюс, если вдруг у юзера, по каким то причинам, отключены картинки (медленный канал, ограниченный, или дорогой трафик, gprs например), или наконец он закроет страницу раньше, чем браузер успеет послать запрос картинки, этот метод не сработает.
_____________
Бесплатному сыру в дырки не заглядывают...