2011-03-06 3 views
4

은 가능한 스트림과 같은 방식으로 PHP의 표준 출력의 데이터를 필터링하는 것입니다 :PHP의 표준 출력 데이터를 스트리밍 필터링하는 방법은 무엇입니까?

standard output ⟶ output filter ⟶ standard output 

이미 ob_start 알고 있어요. 하지만 나는 한 번에 전체 출력을 처리하려고하지 않고 php_user_filter 또는 비슷한 것을 사용하여 스트림과 같은 방식으로 처리하려고합니다.

+0

그래서 표준 출력으로 변경되는 콜백을 정의하는 것이 무엇입니까? 그렇다면 콜백은 언제 호출 될까요 (얼마나 자주)? – Jon

+0

@ 존 : 호출 횟수는 출력 덩어리의 수 (예 :'echo' 매개 변수, 출력 행 또는 일부 내부 버퍼 등)에 따라 달라질 수 있습니다. 또는 그것은 단지 한 번 호출되며 각 청크를 처리하는 준 무한 루프 동안 검사 할 수있는 스트림 상태가 있습니다. – Gumbo

답변

3

나는 이것이 무엇인지 이해하지 못했지만 대답을 게시하지 않을 이유가 없습니다.

ob_start() 콜백을 사용하고 부분 콘텐츠를 처리 할 수 ​​있습니다. 당신이해야 할 일은 초기화 후 바로 ob_implicit_flush()입니다. 이제 일반적으로 콜백은 간단한에서 아웃 기능이지만, 함께 원하는대로 당신은 복잡한 만들 수 있습니다

class ob_callback { 
    function __invoke($part, $end_flag_0x04) { 
     return "+$part"; 
     // or map to $stream->filter($in, $out, &$consumed, $closing) 
    } 
    function __destruct() { /* cleanup */ } 
} 

ob_start(new ob_callback, 2); 
ob_implicit_flush(TRUE); 

내가 스트림-Y 사용은 다음과 같은 형태가 될 것이다 확실하지 않다. 하지만 PHP 표준 출력을 가로채는 다른 방법은 없다고 생각합니다. 암시 적 플러시는 CLI에서 작동하지 않습니다.

0

질문을 올바르게 이해하면 ob_start(), $chunk_size에 두 번째 인수를 사용할 수 있습니다.

ob_start('my_callback', 1024);

상기 예 my_callback()마다 출력 도달 또는 1 킬로바이트 초과 버퍼 발생 부를 것이다. 별도의 진술에서 수 킬로바이트를 뱉어 내면 my_callback()가 여러 번 트리거됩니다. 단일 문자열로 몇 킬로 바이트를 출력하는 경우에는 유용하지 않습니다. my_callback()은 출력마다 한 번만 트리거 될 수 있기 때문에 유용하지 않습니다.

관련 문제