我们在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",
"<\\1<font color=\"#800080\">\\2\\3\\4</font>>",
$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
答案 0 :(得分:2)
该正则表达式的问题在于它有两个.*
个实例,最后s
选项允许.
匹配换行符。
这意味着,在找到<
之后,它必须可能会扫描整个文本的其余部分,以查找[
,然后再次查找]>
。 U
选项意味着它将首先尝试最短的匹配,但它会一直尝试,直到找到匹配或消除所有可能性。它会对文档中的每个<
执行此操作。
将正则表达式更改为Wiktor suggested可以解决问题,但我会更进一步使用占有量词:
"#<([^[]*+)(\[)([^]]*+)(\])>#i"
该函数中的其他正则表达式写得非常糟糕,但每个函数最多包含一个.*
,因此它们不会尝试使系统崩溃。