2017-12-14 6 views
0

그래서 시나리오는 출력 버퍼링을 사용하는 응용 프로그램을 갖고 있으며 응용 프로그램에서 예상되는 결과 외에 일부 추가 데이터를 반환합니다. 예상되는 결과가 출력 버퍼에 추가되는 지점을 조작하여 애플리케이션의이 시점에서 출력 버퍼로 전송되는 데이터가 올바른지 확인하여 예상치 못한 추가 데이터가 다른 소스에서오고 있음을 확인할 수 있습니다.출력 버퍼에 대한 호출을 추적하는 방법

문제는 PHP 스크립트 태그 안에없는 길잃은 문자라고 생각합니다. 그러나 어떤 파일 (있는 경우)이 범인인지 알아낼 필요가 없습니다. 내가 아는 한, 여분의 데이터를 명시 적으로 echo하고있는 파일이 포함될 수 있습니다.

출력 버퍼에 쓰는 파일의 파일 이름과 줄 번호를 캡처하려고했으나 기대했던 것보다 훨씬 어려웠습니다. 처음에는 ob_start이 어디 있는지 알기 때문에 사용자 정의 output_callback을 사용하려고했습니다. 여기에 몇 가지 이미 해봤됩니다

이 함수가 정의 된 파일 이름과 라인 수를 반환
ob_start(function($string) { 
    return __FILE__ . ":" . __LINE__ . " : " $string; 
}); 

하지 그것은 예상대로, 나는 나쁜 출발을 생각하지만, 오프 (에서 호출 된 경우).

ob_start(function($string) { 
    return print_r(debug_print_backtrace(), true) . " : " $string; 
}); 

람다 함수를 파손하는 오류가 발생합니다.

ob_start(function($string) { 
    return var_dump(debug_backtrace()) . " : " $string; 
}); 

결과가 서로 다릅니다. 나는 왜 그런지 완전히 모르겠다는 것을 인정할 것이다. 그러나 대부분의 경우 var_dump은 빈 문자열 (아무 것도 없음)로 해석되었지만 어떤 경우에는 일부 추적 배열을 생성 한 것처럼 보였지만 ob_start 호출의 원점을 반영하는 것은 없었습니다 (다시 말해서, 실제로 echo이라고 불리는 소스 파일은 추적의 일부가 아닙니다.

위의 내용에서 사용자 정의 output_callback 기능을 문제 해결 컨텍스트에 놓을 준비가되었을 때의 모양을 파악하기 위해 몇 가지 기본적인 테스트를 수행했습니다. 문제는 응용 프로그램에 따라 다르므로 출력 기능 (에코, 인쇄 등)을 차단하고 출력 호출의 출처에 대한 정보를 얻는 일반적인 방법을 찾으려고합니다. 코드가 출력 버퍼링을 사용하면 경우

답변

1

가능한 해결책

1

는 길잃은 문자, 아래의 해결책이 도움이 될 수 있음을 뱉어합니다. 또한 출력 버퍼링이 플러시/검색 될 때만 작동하며 모든 print/echo 명령문에서는 작동하지 않습니다. 또한 모든 네이티브 함수는 콜백 함수에서 작동하지 않으며 print_r 중 하나이지만 Exception을 던질 수 있습니다. 아래 코드를 사용하여 문제를 해결하는 데 도움이되는지 확인하십시오.

ob_start(function($buffer) { 
    try { 
     $stackTrace = debug_print_backtrace(); 
     throw new \Exception($stackTrace, 1); 
    } catch (\Exception $ex) { 
     //This line can be logged to a file instead of appending to the buffer 
     $buffer .= PHP_EOL.$ex->getTraceAsString().PHP_EOL.PHP_EOL; 
    } 
    return $buffer; 
}); 

2

첫 번째 해결책으로 문제를 해결하는 데 도움이되지 않으면 Xdebug

3

같은 고급 디버깅 및 프로파일 링 도구를 사용 할 수 있습니다

당신이 정말로 abo를 신경 쓰지 않는다면 현재 현재 줄 앞에서 이미 에코되고있는 내용이나 미래에 비슷한 문제가 발생하지 않는다는 것을 증명하고 싶다면 ob_end_clean을 사용하여 버퍼를 플러시 할 수 있습니다.

pcregrep -rMl '\?>[\s\n]+\z' * 

또는

pcregrep -rM '\?>[\s]+[^\S]*$' *.php 
+0

내가이 문제 해결로 작동합니다 생각하지 않습니다 닫는 태그 결국 PHP 공백을 찾기

4

ob_end_clean(); ob_start(); 
공구를 위해, 1) 그것은 어느 fi를 가르키지 않을 것이다 les은 결과물에 기여한다. (따라서 출력물의 출처가 더 명확하지 않다.) 2) 예제에서 fudgey 출력은 반드시 'ob_start' 전에 발생한다고 가정한다. 커스텀 확장은 적절한'ob_start' 컨텐츠의 범위 내에서 출력에 기여할 수 있지만 단순히 에러가 있거나 출력해서는 안되는 경우에 출력 할 수 있습니다. 목표는 잠재적 인 산출물의 출처를 결정하는 것입니다. – Anthony

+0

더 많은 테스트를 수행하면서 출력 버퍼가 플러시/검색 될 때마다 사용자 정의'ob_callback' 함수가 호출된다는 것을 알았습니다. 출력 버퍼가 업데이트 될 때마다 콜백을 트리거하는 방법이 있습니까? – Anthony

+0

평소처럼 작동하도록'php : // output' 스트림을 오버라이드 할 수 있습니까? 아니면 타임 스탬프 나 다른 식별자를 오류 로그에 보내서 추적 파일과 조정할 수 있습니까? – Anthony

관련 문제