PHP: 优化单个字符串中多个字符串的查找替换过程
PHP: Optimize Find-and-replace procedure of many strings in single string
我正在自动 link 编辑我网站上现有的配置文件,这些配置文件包含在包含配置文件名称的博文文本中。为此,我...
1) ...从 4 个不同的 MySQL 表中提取当前约 500 行(仅?) - 包含不同类型的配置文件 - 在单个数据库中使用 4 个单独的查询。
2) ...str_replace() 每个个人资料名称在博文文本中单独带有 link,如果该个人资料名称存在(之前尝试将它们放入搜索替换数组中并执行还有一个 str_replace()。
虽然它做了它应该做的事情,但它显着降低了 Blogpost 概览页面的速度。在概览页面上加载 10 个帖子,其中每个内容都根据个人资料名称的出现进行检查,加载时间超过 30 秒。如果没有这整个自动link 过程,Blogpost 概览页面加载很快。
我认为罪魁祸首是步骤 2)。如何加快在单个文本字符串中查找和替换大量字符串(来自数据库)的过程?
根据@Devon 和@tadman 的建议,现在用户有义务照顾linking 个人资料。但是,我需要 link 的选项来配置文件,这些配置文件在 post 写作时不存在,但可能会在以后创建。用户现在在编写 post 时通过将他们的名字包含在花括号中来标记任何现有或未来的配置文件。这些是通过执行 preg_replace_callback 并在数据库中搜索大括号内的配置文件名称来找到的。
private function link_profile($name) {
// Put your database search(es) here
// Create link to profile
return $link_to_profile;
}
$text = preg_replace_callback("/\{(.*)\}/Usi", "link_profile", $text);
在我之前的资源详尽分析中,有多达 5N str_replace 次调用数据库中的 N 个配置文件,因为考虑了配置文件名称的变体。现在,对于 post 文本中标记的 N 个配置文件,最多有 N 到 4N 次数据库调用,因为可能需要搜索存在于单个数据库表中的 4 种不同的配置文件类型。新程序将博客加载时间减少到约 3 秒,与以前的方法相比,改进了 10 倍以上。
我正在自动 link 编辑我网站上现有的配置文件,这些配置文件包含在包含配置文件名称的博文文本中。为此,我...
1) ...从 4 个不同的 MySQL 表中提取当前约 500 行(仅?) - 包含不同类型的配置文件 - 在单个数据库中使用 4 个单独的查询。
2) ...str_replace() 每个个人资料名称在博文文本中单独带有 link,如果该个人资料名称存在(之前尝试将它们放入搜索替换数组中并执行还有一个 str_replace()。
虽然它做了它应该做的事情,但它显着降低了 Blogpost 概览页面的速度。在概览页面上加载 10 个帖子,其中每个内容都根据个人资料名称的出现进行检查,加载时间超过 30 秒。如果没有这整个自动link 过程,Blogpost 概览页面加载很快。
我认为罪魁祸首是步骤 2)。如何加快在单个文本字符串中查找和替换大量字符串(来自数据库)的过程?
根据@Devon 和@tadman 的建议,现在用户有义务照顾linking 个人资料。但是,我需要 link 的选项来配置文件,这些配置文件在 post 写作时不存在,但可能会在以后创建。用户现在在编写 post 时通过将他们的名字包含在花括号中来标记任何现有或未来的配置文件。这些是通过执行 preg_replace_callback 并在数据库中搜索大括号内的配置文件名称来找到的。
private function link_profile($name) {
// Put your database search(es) here
// Create link to profile
return $link_to_profile;
}
$text = preg_replace_callback("/\{(.*)\}/Usi", "link_profile", $text);
在我之前的资源详尽分析中,有多达 5N str_replace 次调用数据库中的 N 个配置文件,因为考虑了配置文件名称的变体。现在,对于 post 文本中标记的 N 个配置文件,最多有 N 到 4N 次数据库调用,因为可能需要搜索存在于单个数据库表中的 4 种不同的配置文件类型。新程序将博客加载时间减少到约 3 秒,与以前的方法相比,改进了 10 倍以上。