[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП: flush-у кердык?
FatCat
foreach($urlz as $url)
{
$html = file_get_contents( $url );
// Тут много чего делается...
echo '<li>Обработан '.$url;
flush();
}

Все нормально при больших массивах: процесс молотит себе часами, я на экране в реальном времени вижу степень готовности...

Но понадобилось встроить этот блок кода в чужой интерфейс, на ООП.
Конструкция примерно такого вида:
class functions {

var $urlz = array();

// Тут много всяких функций

function work_url(){
foreach($this->urlz as $url)
{
$html = file_get_contents( $url );
// Тут много чего делается...
echo '<li>Обработан '.$url;
flush();
}
}
}


$funct = new functions;
$funct->urlz = explode(PHP_EOL,$_POST['q']);
$funct->work_url();

И... молотит час, молотит два, а на экране ничего...



Спустя 3 минуты, 6 секунд (1.05.2010 - 23:37) waldicom написал(а):
Может буферизация включена

Спустя 2 часа, 35 минут, 25 секунд (2.05.2010 - 02:12) Nikitian написал(а):
ООП не влияет на работу flush(). В мануале по flush() есть пачка ограничений, когда он может не работать (потому и не люблю этот оператор):
Цитата мануала

flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. It also doesn't affect PHP's userspace output buffering mechanism. This means you will have to call both ob_flush() and flush() to flush the ob output buffers if you are using those.

Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the </table> tag of the outermost table is seen.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

Мой совет: вместо капризного flush() чуть усложнить скрипт, чтобы он каждые n-времени редиректил сам на себя и сбрасывал в лог инфу, которую и показывал для диагностики. Обёртку написать один раз, чтобы потом везде использовать. И будет работать всегда и везде.

Спустя 3 часа, 49 минут, 59 секунд (2.05.2010 - 06:02) dr_Lev написал(а):
Скорее всего уже включена буферизация (ob_get_status()). Тогда рядом с flush(), поставь и ob_flush()
class functions {

var $urlz = array();

// Тут много всяких функций

function work_url(){
foreach($this->urlz as $url)
{
$html = file_get_contents( $url );
// Тут много чего делается...
echo '<li>Обработан '.$url;
ob_flush(); flush();
}
}
}


$funct = new functions;
$funct->urlz = explode(PHP_EOL,$_POST['q']);
$funct->work_url();

Спустя 7 часов, 49 минут, 54 секунды (2.05.2010 - 13:52) FatCat написал(а):
Цитата (Nikitian @ 2.05.2010 - 03:12)
редиректил сам на себя и сбрасывал в лог инфу

Примерно так и решил. Без редиректов, ибо результаты работы в цикле сохраняются в глобальной переменной, а простым дозаписыванием лог-файла внутри цикла, а лог-файл уже можно рефрешить в другом окне браузера.



Цитата (dr_Lev @ 2.05.2010 - 07:02)
уже включена буферизация

Не включена. И при запуске скрипта в локалке под денвером все выводится на экран исправно. Проблема появляется при запуске на хостинге...

Спустя 28 минут, 27 секунд (2.05.2010 - 14:20) Nikitian написал(а):
mod_gzip ?
Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Спустя 3 часа, 24 минуты, 52 секунды (2.05.2010 - 17:45) FatCat написал(а):
Цитата (Nikitian @ 2.05.2010 - 15:20)
mod_gzip ?

[Хлопает себя по лбу]: Точно!!! ГеЗипуется на лету.


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

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