Concrete5.7栈 - PHP最大的执行时间超过
我们具有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",
"<\\1<font color=\"#800080\">\\2\\3\\4</font>>",
$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
与该正则表达式的问题是,它具有在它的.*
两个实例,并且在让.
匹配换行符结束时s
选项。
这意味着,在找到<
之后,它必须扫描潜在的整个剩余文本,查找[
,然后再次查找]>
。 U
选项意味着它将首先尝试最短的匹配,但它会继续尝试,直到它找到匹配或消除所有可能性。它会为文档中的每个<
做到这一点。
改变正则表达式为Wiktor suggested要解决这个问题,但我会采取这一步,使用占有欲量词:
"#<([^[]*+)(\[)([^]]*+)(\])>#i"
在该功能的其他正则表达式只是为写的不好,但它们包含在每一个最多一个.*
,所以他们不会尝试崩溃系统。
您是否在捕获组4(右方括号)中缺少转义字符?即'(])'是'(\])'? –
是和不是。它应该按原样工作,但我通常会逃避它,因为有些口味坚持它。这一次,我只是将它从RegexBuddy复制粘贴出来,在那里我编写了它。为了安全起见,我会继续逃避它。 –
什么是“#<(。*)(\ [)(。*)(\])> #isU”'应该匹配?您可以尝试将其更改为'“#<([^ [] *)(\ [)([^]] *)(])> #i”'看看是否有帮助。所有的正则表达式都是基于'''的,当你处理标记的文本时这是不好的。 –
它总是在一个正则表达式的作者将追加'U'选项,每一个正则表达式,就好像它是一个神奇的蓝色药丸,解决所有的性能问题是个坏兆头。 –
@WiktorStribiżew我认为's'选项可能是必要的,但匹配的代码是/可以是带有(用户输入的)换行符的HTML。 –