[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Фоновый процесс не идет в фоне
FatCat
Полный код довольно большой, локализую проблему:
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 что бы не ждать завершения скрипта.

Спустя 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() не имеет смысла, если не была запущена буферизация.

Не совсем.
Проверьте smile.gif
Где-то видел скрипты, где почему-то 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 например), или наконец он закроет страницу раньше, чем браузер успеет послать запрос картинки, этот метод не сработает.


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.