Php 在html代码上运行preg_replace花费的时间太长
冒着被重定向到的风险(是的,我读了它,并在最后5分钟大声笑了出来),请允许我解释这个问题,这只是众多问题中的一个 我的雇主让我查看一个用PHP编写的网站,使用Smarty作为模板,MySQL作为DBMS。它目前运行非常缓慢,需要2分钟(整个屏幕都是白色的,不少于2分钟)才能完全加载 通过使用xdebug分析代码,我发现一个preg_replace调用需要大约30秒的时间才能完成,它目前会遍历所有HTML代码,并将找到的每个URL替换为其SEO友好版本。完成后,它会将所有代码输出到浏览器。(正如我之前所说的,这不是唯一的问题——代码很旧,它显示了——但我将在这个问题上重点讨论它。) 进一步深入研究代码,我发现它目前查看了1702个模式,每个模式都有适当的匹配(匹配和替换在大小相同的数组中),这肯定会占用时间 代码如下:Php 在html代码上运行preg_replace花费的时间太长,php,html,regex,Php,Html,Regex,冒着被重定向到的风险(是的,我读了它,并在最后5分钟大声笑了出来),请允许我解释这个问题,这只是众多问题中的一个 我的雇主让我查看一个用PHP编写的网站,使用Smarty作为模板,MySQL作为DBMS。它目前运行非常缓慢,需要2分钟(整个屏幕都是白色的,不少于2分钟)才能完全加载 通过使用xdebug分析代码,我发现一个preg_replace调用需要大约30秒的时间才能完成,它目前会遍历所有HTML代码,并将找到的每个URL替换为其SEO友好版本。完成后,它会将所有代码输出到浏览器。(正如我
//This is just a call to a MySQL query which gets the relevant SEO-friendly URLs:
$seourls_data = $oSeoShared->getSeourls();
$url_masks = array();
$seourls = array();
foreach ($seourls_data as $seourl_data)
{
if ($seourl_data["url"])
{
$url_masks[] = "/([\"'\>\s]{1})".$site.str_replace("/", "\/", $seourl_data["url"])."([\#|\"'\s]{1})/";
$seourls[] = "$1".MAINSITE_URL.$seourl_data["seourl"]."$2";
}
}
//After filling both $url_masks and $seourls arrays, then the HTML is parsed:
$html_seo = preg_replace($url_masks, $seourls, $html);
//After it completes, $html_seo is simply echo'ed to the browser.
现在,我知道这个问题的明显答案是:不要用regexp解析HTML。那么,如何解决这个特殊的问题呢?我的第一次尝试可能是:
谢谢。因为你的目标是SEO友好,在目标页面中使用规范标签会告诉搜索引擎使用SEO友好的URL,所以你不需要在代码中替换它们 哎呀,从一开始这真是一个艰难、糟糕的策略,无论如何这不是你的错,
我有两个建议:-
1-由smarty创建缓存技术,因此,第一个HTML仍然在2分钟内生成>
第二个HTMl仅从静态资源获取 2-不要做之前和之后必须做的事情,所以修复系统,创建一个数据库迁移,以良好的格式存储SEO url,或者使用标题或任何东西生成它,在我的系统上,我以这种格式生成SEO链接 www.whater.com/jobs/722/drupal-php-developer 我使用722作为Id,通过解析url来获得正确的页面内容,并且(DrupalPHP开发人员)是文章的标题或任何东西 3-(这不是一个建议)告诉你的客户项目设计得不好(如果你真的相信的话),需要重组以提高绩效。
运行我会说,不要把坏的URL放在html中,先放好的。而不是这种非常缓慢的方式。目前,该网站无法使用。因此,我要做的第一件事是在数据库中创建一个新列,将筛选内容移动到脱机进程,并在新列中记录结果。然后该站点至少可以工作,您可以着手修复实现。
这不是唯一的问题-代码相当旧,它显示了
,是时候重写了。不幸的是,没有快速的方法来实现您的目标,除非您修复内容中的URL,否则regex ing 1702模式有点令人担忧。感谢所有的评论(对于长篇大论的帖子,很抱歉,我想我会尽可能地说清楚。)是的,一个完整的站点重写正在进行中(改用Erlang/ChicagoBoss)但是,由于它不会很快准备好,这个老网站暂时上线了。不幸的是,要使网站处于工作状态需要付出太多的努力,所以我的雇主告诉我不要再考虑它了。thougn,这是学习如何(不)编码的好机会。也许函数需要优化,您是否确定了执行正则表达式所花费的时间。