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",
        "&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

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

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

将正则表达式更改为 应该可以解决问题,但我会更进一步并使用所有格量词:

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

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