Concrete5.7 Stacks - PHP超出最大执行时间

时间:2017-04-18 16:53:11

标签: php regex backreference concrete5-5.7

我们在Concrete5.7中遇到了一个奇怪的问题:我们开始收集相当多的堆栈(当前为64个),并且我们的服务器在编辑页面时已经开始抛出服务器错误(PHP Fatal error: Maximum execution time of 30 seconds exceeded in /example/path/to/website/concrete/blocks/html/controller.php on line 89),特别是在通过XHR获取/ccm/system/panels/add?cID=2468&tab=stacks

我暂时通过在max_execution_time中将php.ini从30增加到60来解决这个问题,但这似乎是一个糟糕的解决方法,在向Stacks添加更多内容后我将不得不再次出现。

除了盲目增加max_execution_time

之外,还有什么我可以做的

跟踪blocks/html/controller.php:89,即xml_highlight()函数;具体来说,这一行(see the code in context here):

    $s = preg_replace(
        "#<(.*)(\[)(.*)(\])>#isU",
        "&lt;\\1<font color=\"#800080\">\\2\\3\\4</font>&gt;",
        $s
    );

这对我来说似乎是一个相当简单的正则表达式;我错过了什么吗?

我也可以从preg_replace删除所有xml_highlight()来电并检查效果,但我不确定这样做会失去什么功能。

供参考,来自dashboard/system/environment/info

# concrete5 Version
Core Version - 5.7.5.2
Version Installed - 5.7.5.2
Database Version - 20150731000000

1 个答案:

答案 0 :(得分:2)

该正则表达式的问题在于它有两个.*个实例,最后s选项允许.匹配换行符。

这意味着,在找到&lt;之后,它必须可能会扫描整个文本的其余部分,以查找[,然后再次查找]&gt;U选项意味着它将首先尝试最短的匹配,但它会一直尝试,直到找到匹配或消除所有可能性。它会对文档中的每个&lt;执行此操作。

将正则表达式更改为Wiktor suggested可以解决问题,但我会更进一步使用占有量词:

"#&lt;([^[]*+)(\[)([^]]*+)(\])&gt;#i"

该函数中的其他正则表达式写得非常糟糕,但每个函数最多包含一个.*,因此它们不会尝试使系统崩溃。