2014-11-28 4 views
0

나는 내가 ob_get_flush()에 대한 치명적인 오류가 laravel 4.이 코드는 다른 프레임 워크뿐만 laravel 좋은 작품 에서 출력 버퍼링에 문제가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를 호출했습니다. –

+0

음, 'ob_start()'전에 'ob_clean();'을 수행 할 수 없어야합니다. 그러나 당신이 할 수 있다고 가정 해 봅시다,이 클래스에서 항상 아약스 요청이 먼저 발생합니까? 그렇지 않다면 여전히'ob_start()'를 시작하지 않았다. –

+0

우리가 아약스 요청에 없다면 "register_shutdown_function"도 실행되지 않고 ob_get_flush()는 결코 호출되지 않을 것입니다. –

1

"그냥"알림이 아니라 오류입니다. 버퍼 내용이 비어 있으므로 PHP (laravel을 통해)가 ob_get_flush과 아무 관련이 없으므로 통지를 보냅니다. 아마 당신이 시도한 다른 프레임 워크에서 알림을 사용할 수 없습니다. 당신이 당신의 버퍼가 빈 상태 (empty)의 경우에도 작동하게하려면 this answer에 따르면, 당신은 같은 것을 할 수 있습니다

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

는 도움이되기를 바랍니다!

+0

문제가 발생한 곳, vendor/symphony/http-foundation/Symphony/Component/HttpFoundation/Response.php function closeOutputBuffers를 발견했습니다. 이 코드에 주석을 달면 if ($ flush) { ob_end_flush(); } else { ob_end_clean(); } "이면 모든 것이 올바르게 작동합니다. 어쨌든 laravel 소스 코드를 편집하지 않고 이것을 비활성화 할 수 있습니까? –

+1

그래,하지만 벤더 파일을 수정해서는 안되며, 코드를 수정해야한다. 코드를 벤더 코드에 적용하는 것이 더 좋다. –

+2

좋아,이 답변을 좀 볼 수 있습니다 : http://stackoverflow.com/a/23965433/978690 코드에 플래그를 사용할 수 있습니다 –

0

Request :: ajax()가 true를 반환하기 전에 클래스가 호출되고있을 가능성이 있습니까?

그렇다면 생성자 조건부는 false를 반환하고 ob_start는 호출되지 않습니다. 아마도 그 부분을 조건부 밖으로 옮기거나 객체에 데이터를 쓰는 위치로 다시 작성한 다음 renderOutput()을 호출하면이 메소드는 올바른 순서로 ob 호출을 수행합니다.