【问题标题】:ob_get_clean with ob_start callback function带有 ob_start 回调函数的 ob_get_clean
【发布时间】:2019-06-10 12:20:51
【问题描述】:

我正在尝试使用多个 ob_start 获得缓冲输出。有些 ob_start 有回调函数。函数调用但没有效果。

<?php
function callback($buffer)
{
    return "deleted\n";
}

ob_start();
echo "first\n";
ob_start("callback");
echo "second\n";
ob_start();
echo "third\n";

$final = '';
$levels = ob_get_level();

for ($i = 0; $i < $levels; $i++) {
    $final .= ob_get_clean();
}
echo $final;

预期结果是

third
deleted
first

但我明白了

third
second
first

我做错了什么?

【问题讨论】:

    标签: php buffer


    【解决方案1】:

    我也对此感到惊讶,文档可能对此更加清楚。根据documentation

    ob_get_clean() 本质上同时执行 ob_get_contents() 和 ob_end_clean().

    但是,$callbackob_start($callback) is called when

    [...] 输出缓冲区被刷新(发送)或清理(使用 ob_flush(), ob_clean() 或类似函数)或刷新输出缓冲区时 在请求结束时发送到浏览器。

    $callback 被调用时,ob_get_contents() 已经被调用,对$contents 没有影响。

    我们可以在PHP source code:确认

    PHP_FUNCTION(ob_get_clean)
    {
        if (zend_parse_parameters_none() == FAILURE) {
            RETURN_THROWS();
        }
    
        if(!OG(active)) {
            RETURN_FALSE;
        }
    
        if (php_output_get_contents(return_value) == FAILURE) {
            php_error_docref("ref.outcontrol", E_NOTICE, "Failed to delete buffer. No buffer to delete");
            RETURN_FALSE;
        }
    
        if (SUCCESS != php_output_discard()) {
            php_error_docref("ref.outcontrol", E_NOTICE, "Failed to delete buffer of %s (%d)", ZSTR_VAL(OG(active)->name), OG(active)->level);
        }
    }
    

    我认为没有办法解决这个问题。您需要注意如何使用ob_get_contents()。如果要堆叠多个输出处理程序,请仅使用 ob_start($callback)s。如果有一个选项可以在ob_get_contents() 和等效项上调用$callback,那肯定会很好。

    【讨论】:

    • 感谢您的回答!不幸的是,这不是我的代码。我只是想弄清楚为什么 WordPress 上的某些项目存在缓存问题。现在我明白了。但仍然不知道如何解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多