Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Не работает ob_flush() на сервере


Автор: nepster 11.1.2014, 07:28
Использую SEE и наткнулся на такой косяк:

На локальном сервере все работает:
Код

 public function actionUpdateProposals()
    {
        // id игры 
        $game_id = (isset($_GET['id']) && is_numeric($_GET['id'])) ? (int)$_GET['id'] : 0;
        
        set_time_limit(120);

        header('Content-type: text/html; charset=utf-8');
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header("Access-Control-Allow-Origin: *");
        
        $start = time();
        
        $lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0);
        if ($lastEventId == 0) 
        {
            $lastEventId = (isset($_GET["key"])) ? (string)$_GET["key"] : 0;
        }
        
  
        while(true) 
        {
            //if ((time() - $start) > 10) {break;}
        
            //echo ":" . str_repeat(" ", 2048) . "\n"; // 2 kB padding for IE
            echo "retry: 2000\n";
            echo "id: {$lastEventId}" . PHP_EOL;
            echo "data: " . GameOperations::load()->getJsonProposalsData($game_id) . PHP_EOL;
            echo PHP_EOL;
            
            ob_flush();
            flush();
        }
        
    }


Что должно быть:
Соединяемся держим соединение 2 минуты, в это время каждые 5 секунд отдаем данные. 
На локалке все хорошо (апатч)


Переносим на сервер (нгинкс) и выхватываем:
Ждет 2 минуты, конектиться отдает данные теряет соединение. Ждет 2 минуты и так далее...

Прочитал про всякие настройки типа:
Код
output_buffering = Off
zlib.output_compression = Off


Поставил, теперь выглядит вот так:
Соединение 
Обновление данных 
Потеря соединения 
Соединение 
Обновление данных 
Потеря соединения 
Соединение 
Обновление данных 
Потеря соединения 

И так бомбит постоянно. 


на нгинксе добавил:
Код
    gzip off;
    proxy_buffering off;


Всеравно не спасло. 

Подскажите пожалуйста в чем проблема ?

Автор: baldina 11.1.2014, 13:42
какие значения таймаутов на nginx?

Автор: nepster 11.1.2014, 18:45
не прописанны в конфингах. Тоесть скорее всего дефолтные. Разобался с проблемой. 
Значит у меня на сервере по жесткому, все ошибочки в студии. 


Код

Нельзя использовать 
ob_flush()
flush()

без ob_start();


На сервере где вывод ошибок отключен все нормально, можно прикрыть собакой (но это плохой тон).


В общем ситуация была такая, выводились данные и ниже Yii роутил весь html код страницы ошибок, ошибка 500 что то там с буфером. Я добавил ob_start() и результат был такой:

Загружается страница, проходит секунд 12 и вылетает порция данных штук 6 или 7 (я в js написал вывод в консоль если данные обновиилсь). 
Далее все возможные примеры не давали результат. 

Я стал использовать древнейший метод, "пальцем в небо". Тоесть все решения по теме все примеры перебирал. Пока совершенно случайно после 7 часов попыток все не заработало.

Настройки нгинкса:

Код

    fastcgi_keep_conn on; # < solution

    proxy_buffering off;
    gzip off;


Это должно быть в локейшине, который обрабатывает чихпыхпых файлы 

В php.ini 
Код

implicit_flush = Off
output_buffering = Off
zlib.output_compression = Off
;output_handler = // обратите внимаение на ; справа





Код вышел вот такой:
Код


        if (ob_get_level() == 0) ob_start('ob_gzhandler');

        while(true) 
        {
            //if ((time() - $start) > 10) {break;}
            //echo ":" . str_repeat(" ", 2048) . "\n"; // 2 kB padding for IE
            echo "retry: 2000\n";
            echo "id: {$lastEventId}" . PHP_EOL;
            echo "data: " . GameOperations::load()->getJsonProposalsData($game_id) . PHP_EOL;
            echo PHP_EOL;
            
            ob_flush();
            flush();
            
            sleep(2);
        }

Автор: RootMaster 25.5.2014, 14:31
nepster, Спасибо огромное за решение!!! Сократил уйму времени.

Я от себя еще бы добавил.
Проверять надо на количестве сообщений хотя бы больше 10, иначе не поймете, работает вывод или нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)