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 缓冲区的内容并将回调应用于它。如果第一个参数为真,则将内容传递给下一个输出缓冲处理程序。在这种情况下它是假的,所以即使它执行了回调,内容也会丢失。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。