PHP:输出缓冲区回调不改变输出

kevingrace 阅读:38 2024-11-01 17:39:52 评论:0

我有一个带有回调函数的输出缓冲区。但是,在清理缓冲区时,会执行回调函数,但不会更改返回的字符串。

我正在使用以下代码:

<?php 
ob_start('callback'); 
print 'some text'; 
error_log(ob_get_clean()); 
 
function callback($content) { 
  error_log('callback'); 
  return $content . ' altered';  
} 

输出:
callback 
some text 

我想要的是:
callback 
some text altered 

我错过了什么?我在 CLI 中使用 PHP 5.3.10。

编辑:正在执行回调。

从 PHP 手册:

The function will be called when the output buffer is flushed (sent) or cleaned (with ob_flush(), ob_clean() or similar function) or when the output buffer is flushed to the browser at the end of the request.

请您参考如下方法:

我不确定这是错误还是功能。查看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 的源代码(main/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 缓冲区的内容并将回调应用于它。如果第一个参数为真,则将内容传递给下一个输出缓冲处理程序。在这种情况下它是假的,所以即使它执行了回调,内容也会丢失。


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号