2014-11-28 4 views
0

У меня есть проблема с буферизацией вывода в Laravel 4. Этот код работает хорошо в других рамках, но в Laravel я получаю фатальную ошибку для ob_get_flush()Laravel и буферизация вывода

class Ajax 
{ 
    public function __construct() 
    { 
     if (Request::ajax()) 
     { 
      ob_clean(); 
      ob_start(function(){}); 
      register_shutdown_function(array(&$this,'setOutput')); 

     } 

    } 

    public function setOutput() 
    { 
     $html = ob_get_flush(); 
    } 

} 

ошибка:

ob_get_flush(): failed to delete and flush buffer. No buffer to delete or flush 

ответ

2

Похож, что вы пытаетесь выполнить флеш перед вами ob_start() ed.

+0

Как вы видите, я вызвал ob_start в конструкторе класса, если мы находимся в ajax-запросе –

+0

Ну, вы даже не сможете выполнять 'ob_clean();' перед 'ob_start()'. Но давайте предположим, что вы можете, это первое, что случается в этом классе всегда как ajax-запрос? Если нет, то вы все еще не инициировали 'ob_start()'. –

+0

Если мы не в ajax-запросе, тогда «register_shutdown_function» не будет работать, и ob_get_flush() никогда не будет вызван –

1

Это «только» уведомление, а не ошибка. Содержимое вашего буфера пуст, поэтому PHP (через laravel) отправляет вам уведомление, потому что оно не имеет никакого отношения к ob_get_flush. Возможно, уведомления отключены в других рамках, которые вы пробовали. Согласно this answer, вы можете сделать что-то вроде этого, если вы хотите, чтобы заставить его работать, даже если ваш буфер пуст:

public function setOutput() 
{ 
    if (ob_get_level() > 1) $html = ob_get_flush(); 
} 

Надеется, что это поможет!

+0

Я нашел, где эта проблема, функция vendor/symphony/http-foundation/Symphony/Component/HttpFoundation/Response.php closeOutputBuffers. Если я прокомментирую этот код «if ($ flush) { ob_end_flush(); } else { ob_end_clean(); }", все работает хорошо. Есть ли способ отключить это без редактирования исходного кода laravel? –

+1

Хорошо, но вы не должны изменять файл поставщика, вы должны исправить свой код, я думаю, что лучше адаптировать свой код к коду поставщика. –

+2

Хорошо, вы можете посмотреть этот ответ: http://stackoverflow.com/a/23965433/978690 Вы можете использовать флаги в своем коде –

0

Возможно ли, что класс вызывается перед запросом :: ajax() может возвращать true?

Если это так, то ваш конструктор условный возвращает false, а ob_start не будет вызываться. Возможно, вы можете перенести эту часть из условного выражения или попытаться переписать ее туда, где вы записываете данные в объект, а затем вызывать renderOutput(), и этот метод будет иметь ваши вызовы ob в правильном порядке.

Смежные вопросы