2017-04-18 72 views
0

我们具有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时。Concrete5.7栈 - PHP最大的执行时间超过

我暂时解决了这个由php.ini从30%增加到max_execution_time到60,但是这似乎是一个贫穷的解决方法,我将不得不增加更多的内容,以筹码后再次碰撞。

除了只是盲目增加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 
    ); 

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

它也发生,我认为我可以从xml_highlight()删除所有preg_replace调用和查询性能,但我不确定我会这样做会失去什么功能。

作为参考,从dashboard/system/environment/info

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

什么是“#<(。*)(\ [)(。*)(\])> #isU”'应该匹配?您可以尝试将其更改为'“#<([^ [] *)(\ [)([^]] *)(])> #i”'看看是否有帮助。所有的正则表达式都是基于'''的,当你处理标记的文本时这是不好的。 –

+1

它总是在一个正则表达式的作者将追加'U'选项,每一个正则表达式,就好像它是一个神奇的蓝色药丸,解决所有的性能问题是个坏兆头。 –

+0

@WiktorStribiżew我认为's'选项可能是必要的,但匹配的代码是/可以是带有(用户输入的)换行符的HTML。 –

回答

2

与该正则表达式的问题是,它具有在它的.*两个实例,并且在让.匹配换行符结束时s选项。

这意味着,在找到&lt;之后,它必须扫描潜在的整个剩余文本,查找[,然后再次查找]&gt;U选项意味着它将首先尝试最短的匹配,但它会继续尝试,直到它找到匹配或消除所有可能性。它会为文档中的每个&lt;做到这一点。

改变正则表达式为Wiktor suggested要解决这个问题,但我会采取这一步,使用占有欲量词:

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

在该功能的其他正则表达式只是为写的不好,但它们包含在每一个最多一个.*,所以他们不会尝试崩溃系统。

+0

您是否在捕获组4(右方括号)中缺少转义字符?即'(])'是'(\])'? –

+1

是和不是。它应该按原样工作,但我通常会逃避它,因为有些口味坚持它。这一次,我只是将它从RegexBuddy复制粘贴出来,在那里我编写了它。为了安全起见,我会继续逃避它。 –