Concrete5.7 堆栈 - PHP 超过最大执行时间
Concrete5.7 Stacks - PHP Maximum execution time exceeded
我们在 Concrete5.7 中的 Stacks 遇到了一个奇怪的问题:我们开始收集相当多的堆栈(当前为 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
时。
我通过在 php.ini
中将 max_execution_time
从 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
);
对我来说,这似乎是一个相当简单的正则表达式;我错过了什么吗?
我还想到我可以从 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
选项意味着它将首先尝试最短的匹配,但它会继续尝试直到找到匹配或消除所有可能性。它会为文档中的每个 <
执行此操作。
将正则表达式更改为 应该可以解决问题,但我会更进一步并使用所有格量词:
"#<([^[]*+)(\[)([^]]*+)(\])>#i"
该函数中的其他正则表达式写得同样糟糕,但它们每个最多包含一个 .*
,因此它们不会试图使系统崩溃。
我们在 Concrete5.7 中的 Stacks 遇到了一个奇怪的问题:我们开始收集相当多的堆栈(当前为 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
时。
我通过在 php.ini
中将 max_execution_time
从 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
);
对我来说,这似乎是一个相当简单的正则表达式;我错过了什么吗?
我还想到我可以从 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
选项意味着它将首先尝试最短的匹配,但它会继续尝试直到找到匹配或消除所有可能性。它会为文档中的每个 <
执行此操作。
将正则表达式更改为
"#<([^[]*+)(\[)([^]]*+)(\])>#i"
该函数中的其他正则表达式写得同样糟糕,但它们每个最多包含一个 .*
,因此它们不会试图使系统崩溃。