PHP:优化单个字符串中多个字符串的查找和替换过程

时间:2018-07-09 16:28:48

标签: php mysql str-replace autolink

我正在自动链接网站上存在的个人资料,其中包含包含个人资料名称的博客文章。为此,我...

1)......使用4个单独的查询,在一个数据库中从4个不同的MySQL表(目前包含不同类型的配置文件)中提取约500行(仅?)。

2)... str_replace()每个配置文件名称(在博客文章文本中均带有链接)单独存在(如果该配置文件名称存在(尝试将它们放在搜索替换数组之前,并且也执行单个str_replace())。 / p>

尽管它可以执行预期的操作,但会大大减慢Blogpost概述页面的速度。在概述页面上加载10个帖子(其中每个内容均与个人资料名称的存在情况进行检查)需要30秒钟以上的时间加载。如果没有整个自动链接过程,则Blogpost概述页面将很快加载。

我相信罪魁祸首是步骤2)。我该如何加快在单个文本字符串中查找和替换大量字符串(来自数据库)的过程?

1 个答案:

答案 0 :(得分:0)

按照@Devon和@tadman的建议,现在用户有义务注意链接配置文件。但是,我需要选项来链接到在撰写本文时不存在但可能稍后创建的配置文件。用户现在可以在写帖子时通过在花括号中包括其姓名来标记任何现有或将来的个人资料。通过执行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);

在我先前的资源穷尽的ansatz中,由于考虑了配置文件名称的变化,在数据库中最多有5N str_replace个调用N个配置文件。现在,对于发布文本中标记的N个配置文件,最多有N个到4N个数据库调用,因为可能需要搜索存在于单个DB表中的4种不同的配置文件类型。新程序将Blog的加载时间减少到〜3s,比以前的方法提高了10倍以上。