Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在html代码上运行preg_replace花费的时间太长_Php_Html_Regex - Fatal编程技术网

Php 在html代码上运行preg_replace花费的时间太长

Php 在html代码上运行preg_replace花费的时间太长,php,html,regex,Php,Html,Regex,冒着被重定向到的风险(是的,我读了它,并在最后5分钟大声笑了出来),请允许我解释这个问题,这只是众多问题中的一个 我的雇主让我查看一个用PHP编写的网站,使用Smarty作为模板,MySQL作为DBMS。它目前运行非常缓慢,需要2分钟(整个屏幕都是白色的,不少于2分钟)才能完全加载 通过使用xdebug分析代码,我发现一个preg_replace调用需要大约30秒的时间才能完成,它目前会遍历所有HTML代码,并将找到的每个URL替换为其SEO友好版本。完成后,它会将所有代码输出到浏览器。(正如我

冒着被重定向到的风险(是的,我读了它,并在最后5分钟大声笑了出来),请允许我解释这个问题,这只是众多问题中的一个

我的雇主让我查看一个用PHP编写的网站,使用Smarty作为模板,MySQL作为DBMS。它目前运行非常缓慢,需要2分钟(整个屏幕都是白色的,不少于2分钟)才能完全加载

通过使用xdebug分析代码,我发现一个preg_replace调用需要大约30秒的时间才能完成,它目前会遍历所有HTML代码,并将找到的每个URL替换为其SEO友好版本。完成后,它会将所有代码输出到浏览器。(正如我之前所说的,这不是唯一的问题——代码很旧,它显示了——但我将在这个问题上重点讨论它。)

进一步深入研究代码,我发现它目前查看了1702个模式,每个模式都有适当的匹配(匹配和替换在大小相同的数组中),这肯定会占用时间

代码如下:

//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。那么,如何解决这个特殊的问题呢?我的第一次尝试可能是:

  • 将(最好是格式良好的)HTML加载到DOMDocument中,然后获取每个a标记中的每个href属性
  • 检查每个节点,替换为其相应匹配项找到的URL(这可能意味着无论如何都要使用以前的regexp,但字符串大小要小得多)
  • 利润
  • 但我认为这很可能不是解决问题的正确方法。 有什么想法或建议吗


    谢谢。

    因为你的目标是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,这是学习如何(不)编码的好机会。也许函数需要优化,您是否确定了执行正则表达式所花费的时间。