Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает ob_flush() на сервере 
V
    Опции темы
nepster
Дата 11.1.2014, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



Использую 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;


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

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

Это сообщение отредактировал(а) nepster - 11.1.2014, 07:29
PM MAIL   Вверх
baldina
Дата 11.1.2014, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



какие значения таймаутов на nginx?

PM MAIL   Вверх
nepster
Дата 11.1.2014, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



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


Код

Нельзя использовать 
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);
        }

PM MAIL   Вверх
RootMaster
Дата 25.5.2014, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



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

Я от себя еще бы добавил.
Проверять надо на количестве сообщений хотя бы больше 10, иначе не поймете, работает вывод или нет.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1176 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.