繁体   English   中英

PHP中preg_match_all上的Fastcgi 500错误

[英]Fastcgi 500 error on preg_match_all in PHP

我正在尝试设置一些奇异的PHP代码(我不是专家),并且在包含“ preg_match_all”的PHP行上出现FastCGI错误500。

当我注释掉该行时,页面返回200(但不是它的原意)。

该代码将解析从数据库加载的PHP,HTML和JavaScript内容,并将它们组成以返回完成的页面。

现在,通过放置一些error_log条目,我可以确定带有preg_match_all的行是500的原因。但是,在页面加载过程中该行多次被击中,在其他情况下,该行不会导致错误。

看起来是这样的:

preg_match_all ("/(<([\w]+)[^>]*>)((?:.|\n)*)(<\/\\2>)/",
                $part['data'], $tags, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

主题字符串是一段类似于以下内容的文本:

<script> ... some javascript functions ... </script>

编辑:这是在其他地方正常运行的代码,因此这很可能是PHP设置或环境差异。 我在带有FastCGI的IIS6上使用PHP 5.2.13。

编辑:日志文件中未提及任何内容。 至少我没有检查过:

  • IIS日志
  • 事件记录
  • PHP日志

编辑: jab11 指出了问题 ,但还没有解决方案:

任何想法或方向都将受到欢迎。

$part['data']可能会非常大吗? 当我在大于100 KB的字符串上使用preg_match_all时,会出现500错误。

这是一个很好的例子,为什么用正则表达式处理HTML是个坏主意。 我敢打赌,由于HTML源字符串包含一些未关闭的标签,因此您正陷入堆栈溢出的局面,这使得regex尝试了各种各样的排列,以徒劳无益地尝试找到关闭标签( </\\2> )。 在32 KB的HTML文件中,可以很容易地将正则表达式从手推车上扔下来。 也许堆栈在另一台服务器上的大小是不同的,所以它可以在一个服务器上工作,而在另一个服务器上不能工作。

快速测试:

我将正则表达式应用于了此页面的源代码(在删除了</html>标记后)。 RegexBuddy立即进行了约一分钟的消声处理,然后与<head><body>标记匹配(成功)。 <html>调试正则表达式表明,它花了正则表达式引擎970257步骤来发现它不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM