使用ob_start进行php缓冲:同步替代

时间:2015-12-23 19:54:41

标签: php synchronization ob-start

Hy社区

我遇到一些麻烦,无法找到解决方案。我目前正在开发一个wordpress插件,我想要做的是操纵一些内容。使用PHP缓冲(ob_start)工作正常,但给我一些新的麻烦。我正在做的是以下(最小化)。

我们假设我的网页包含以下文字:

Hy there, my name is A B, I am living in C with my dog D

php代码正在做什么:用子函数的输出替换一组字符串。当然,这只是一个极小的例子。

<?php
// -----------------------------------------
// The Function loading some content from a php file
function my_function() {
    ob_start();
    require_once("some_file.php");
    $content = ob_get_contents();
    ob_end_clean();
    return($content); // Returns new content
}
// -----------------------------------------

// Content of the web page
$content = "Hy there, my name is A B, I am living in C with my dog D";

// Strings to replace (by the content returned by "my_function")
$matches = array("A","B","C","D");

// Looping over the different matches
foreach ( $matches as $match ) {

    // Calling my_function in buffer mode
    $content = str_replace($match,call_user_func("my_function"),$content);


} ?>

嗯,现在发生的事情是缓冲是根据定义async。第一个my_function调用完成后,整个缓冲区将被清除,“A”不会替换为“A”应被替换,但也包含部分内容“B”应该替换为:)。如果只有一件事要替换,那就非常好(只有一个ob_start过程)。

有没有其他方法来捕获include或require调用的输出,或以同步方式运行ob_*?也许有一种更好的方式我没有找到。得到一个暗示会很棒:)。

提前致谢!也许我完全走错了路,但这就是学习的方法:)。

复活节快乐, 雷托

1 个答案:

答案 0 :(得分:2)

因为你使用require_once。 但是对于require_once文件已包含 ONCE ! 您可以使用require或include for multiple。 但这是不好的方式。糟糕的建筑。