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在编辑页面时开始抛出服务器错误( ),特别是在/ccm/system/panels/add?cID=2468&tab=stacks通过 XHR 获取时。

max_execution_time我通过从 30 增加到 60 in暂时解决了这个问题php.ini,但这似乎是一个糟糕的解决方法,在向 Stacks 添加更多内容后我将不得不再次碰撞。

除了盲目增加,我还能做些max_execution_time什么吗?

追踪到blocks/html/controller.php:89,即在xml_highlight()函数中;具体来说,这一行(参见此处上下文中的代码):

    $s = preg_replace(
        "#<(.*)(\[)(.*)(\])>#isU",
        "&lt;\\1<font color=\"#800080\">\\2\\3\\4</font>&gt;",
        $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
4

1 回答 1

2

该正则表达式的问题在于它有两个实例.*,并且s末尾的选项允许.匹配换行符。

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

按照Wiktor 的建议更改正则表达式应该可以解决问题,但我会更进一步并使用所有格量词:

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

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

于 2017-04-18T20:01:42.953 回答