php 缓冲 ob_start:同步替代
php buffering with ob_start: synchronous alternative
Hy 社区
我在使用 php 时遇到了一些问题,找不到解决方案。我目前正在开发一个 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);
} ?>
好吧,现在发生的情况是缓冲按照定义是异步的。一旦第一个 my_function
调用完成,整个缓冲区将被清理并且“A
”不会被替换为“A
”应该替换的内容,但还包含部分内容“B
”应替换为 :)。如果只有一件事要替换,那效果很好(只有一个 ob_start
过程)。
是否有任何其他方法可以捕获 include 或 require 调用的输出,或者以同步方式捕获 运行 ob_*
?也许会有更好的方法我还没有找到。得到提示会很棒 :)。
提前致谢!也许我完全走错了路,但这就是学习的方式:)。
复活节快乐,
雷托
因为你使用require_once。
但是 require_once 文件包含 ONCE!
您可以对多个包含使用 require 或 include。
但这是不好的方法。糟糕的架构。
Hy 社区
我在使用 php 时遇到了一些问题,找不到解决方案。我目前正在开发一个 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);
} ?>
好吧,现在发生的情况是缓冲按照定义是异步的。一旦第一个 my_function
调用完成,整个缓冲区将被清理并且“A
”不会被替换为“A
”应该替换的内容,但还包含部分内容“B
”应替换为 :)。如果只有一件事要替换,那效果很好(只有一个 ob_start
过程)。
是否有任何其他方法可以捕获 include 或 require 调用的输出,或者以同步方式捕获 运行 ob_*
?也许会有更好的方法我还没有找到。得到提示会很棒 :)。
提前致谢!也许我完全走错了路,但这就是学习的方式:)。
复活节快乐, 雷托
因为你使用require_once。 但是 require_once 文件包含 ONCE! 您可以对多个包含使用 require 或 include。 但这是不好的方法。糟糕的架构。