버그 또는 기능인지 확실하지 않습니다. 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이므로 콜백을 실행하더라도 내용이 손실됩니다.
PHP 매뉴얼에 ob_get_clean()이 포함되어 있다고되어 있습니까? 실험은 그렇지 않다고 말하는 강력한 주장입니다. 또한, 아마 버퍼가 수정되고있는 것 같지만 get의 결과는 그렇지 않습니다. –