preg_match_all('/(a)*/', str_repeat('a', 1000), $matches);(编辑:稍微修改regexp,使其在崩溃时更简单)
我在PHP5.3.5上使用Apache2.0运行它,它使服务器崩溃。如果我把339改为338,它就不会再崩溃了,所以在我看来,它就像是一个bug。我试着把它报告给http://bugs.php.net/,但是它坏了。这是PHP错误吗?对其他人来说会崩溃吗?
编辑:将代码更改为
preg_match_all('/(?:a)*/', str_repeat('a', 339), $matches);允许在碰撞前使用较长的字符串。如果没有崩溃,请尝试将字符串长度增加10或100倍,因为这可能是内存问题,您可能有更多的内存。
编辑2:崩溃是一个完整的进程崩溃,在Windows7上,我在执行后立即得到“结束任务”消息。
编辑3:如果崩溃是由于过多的回溯造成的,而且上面的示例显然可以导致崩溃,那么下面不应该这样做:
preg_match('/[^"\']*(;|$)/',
str_repeat('x', 1000), $matches);这是我真正的代码崩溃了。它只是用来拆分;的多个SQL查询,同时允许;使用单引号或双引号。为什么这会导致这么多的回溯,我该如何修复呢?
发布于 2011-06-17 07:10:30
问题不是内存或执行时间..。
ini_set('pcre.backtrack_limit', 10000);如果需要的话,可以随意地将将 10000降到不同的值。有关更多信息,请参见http://php.net/manual/en/pcre.configuration.php。
如果您想测试它崩溃的位置:
<?php
ini_set('pcre.backtrack_limit', 10000);
for ( $i = 1; $i < 65535; $i++ )
{
echo $i . PHP_EOL;
preg_match_all('/(a)*/', str_repeat('a', $i), $matches);
}
?>https://stackoverflow.com/questions/6382330
复制相似问题