2012-09-12 2 views
2

콜백 함수가있는 출력 버퍼가 있습니다. 그러나 버퍼를 정리할 때 콜백 함수가 실행되지만 반환 된 문자열은 변경되지 않습니다. 나는 다음과 같은 코드를 사용하고PHP : 출력 버퍼 콜백이 출력을 변경하지 않습니다.

:

<?php 
ob_start('callback'); 
print 'some text'; 
error_log(ob_get_clean()); 

function callback($content) { 
    error_log('callback'); 
    return $content . ' altered'; 
} 

출력 :

callback 
some text altered 

내가 무엇을 놓치고 : 내가 원하는 무엇

callback 
some text 

? CLI에서 PHP 5.3.10을 사용하고 있습니다.

편집 : 콜백이 실행 중입니다. PHP 매뉴얼에서

:

출력 버퍼 플래시시 함수가 호출된다 (전송) 또는하거나 을 (ob_flush() ob_clean() 또는 유사한 기능) 세정 출력 버퍼는 요청이 끝나면 브라우저에 플러시됩니다.

+0

PHP 매뉴얼에 ob_get_clean()이 포함되어 있다고되어 있습니까? 실험은 그렇지 않다고 말하는 강력한 주장입니다. 또한, 아마 버퍼가 수정되고있는 것 같지만 get의 결과는 그렇지 않습니다. –

답변

6

버그 또는 기능인지 확실하지 않습니다. PHP 소스 코드를 보면, 나는 콜백이 호출되기 전에 ob_get_clean의 반환 값이 가득 차 있음을 발견했다.

나는 적어도 두 가지 해결 방법을 참조하십시오. 첫 번째는 직접 출력 문자열에서 콜백을 수동으로 호출하는 것입니다. 나는 이것이 예를 필요로하지 않는다고 생각한다.

두번째 출력 버퍼링을 적재 할 수있는 가능성을 활용하는 것이다. 플러시가 성공적으로 콜백을 사용하므로 추가 출력 버퍼에 출력 코드를 래핑하고 수정 된 내용을 가져올 수 있습니다. 당신이 궁금하면

ob_start(); 

function callback($input) { return $input . " altered"; } 
ob_start('callback'); 
echo "foo"; 
ob_end_flush(); 

$content = ob_get_clean(); 
ob_end_clean(); 
echo $content . "\n"; // prints "foo altered\n" 

ob_get_clean (/ 주 output.c)의 소스 코드를 참조하십시오. PHP 웹 사이트에서 소스 코드를 얻을 수 있습니다. 다음은 몇 가지 지침입니다.

/* {{{ proto bool ob_get_clean(void) 
    Get current buffer contents and delete current output buffer */ 
PHP_FUNCTION(ob_get_clean) 
{ 
    if (zend_parse_parameters_none() == FAILURE) { 
     return; 
    } 

    // THIS CALL FILLS THE RETURN VALUE 
    if (php_ob_get_buffer(return_value TSRMLS_CC) == FAILURE) { 
     RETURN_FALSE; 
    } 

    if (!OG(ob_nesting_level)) { 
     php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer. No buffer to delete"); 
     zval_dtor(return_value); 
     RETURN_FALSE; 
    } 
    if (OG(ob_nesting_level) && !OG(active_ob_buffer).status && !OG(active_ob_buffer).erase) { 
     php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer %s", OG(active_ob_buffer).handler_name); 
     zval_dtor(return_value); 
     RETURN_FALSE; 
    } 

    // THIS CALL KILLS THE CURRENT BUFFER AND EXECUTES THE CALLBACK 
    php_end_ob_buffer(0, 0 TSRMLS_CC); 
} 
/* }}} */ 

php_end_ob_buffer은 OB 버퍼의 내용을 취하고 그것을 콜백을인가한다. 첫 번째 매개 변수가 true이면 내용을 다음 출력 버퍼링 처리기로 전달합니다. 이 경우 false이므로 콜백을 실행하더라도 내용이 손실됩니다.

-1

PHP 용 CLI는 출력 버퍼링을 사용하지 않습니다 (또는 특히 buffing은 ob_ 기능과 관련이 없습니다). 콜백이 건너 뜁니다.

편집 : 실제로 표준 출력 버퍼링을 CLI에서 사용할 수 있는지 확인하는 데 문제가 있습니다. 나는 ob_end_flush(), ob_flush()flush()을 시도 할 것입니다.

+0

나는 디버그 메시지를 추가 할 때 콜백이 실행되는 것을 볼 수 있습니다. – Bart

+0

출력 버퍼링은 CLI 모드에서 작동 _does_. – zneak

-1

버퍼가 플러싱 될 때 호출 될 것이다

ob_start('callback'); 
print 'some text'; 
ob_end_flush(); 

function callback($content) { 
    return $content . ' altered'; 
} 

P.S. CLI에서도 작동합니다.

-1

ob_get_clean이 제거되고 코드가 작동합니다.

ob_start('callback'); 
print 'some text'; 
//error_log(ob_get_clean()); 

$buffer = ob_get_flush(); 

function callback($content) { 
    return $content . ' altered'; 
} 

출력을 확인한 결과 알림 메시지가 나타납니다.

왜 ob_get_clean() 메소드를 사용합니까? 버퍼를 정리합니다.

+0

버퍼를 청소해야하는 좋은 이유가 있습니다. – zneak

+0

제 3자를 사용하고 있지 않습니다. 또한 수천 가지 이유가 있습니다. – Bart

1

내가 추측 할 수만 있다면 그렇게 될 것입니다.

ob_get_clean()이 버퍼 결과를 반환하고 다음을 삭제하고 콘텐츠를 수정하는 콜백을 트리거합니다.

IE

"텍스트가"버퍼로부터 추출하고 '하기'기능의 요구에 따라 반환 할 준비가된다.

다음으로 버퍼가 정리되지만 콜백이 존재할 때 다양한 콜백이 필요한 경우 다양한 ob 함수에 대한 요구 사항에 따라 콜백이 컨텐츠에 대해 트리거됩니다.

결과는 (요청에 따라) 버퍼가 반환되지만 가져 오기는 청소하기 전에 발생 이후는, 이후 수정 된 것입니다.

-1
<?php ob_start('callback'); ?> 

    Foo Bar Baz 

<?php 
    ob_end_flush(); 

    function callback($content) { 
    $find = "Baz"; 
    $replace_with = "Foo"; 
    return (
     str_replace($find, $replace_with, $content) 
    ); 
    } 
?>