preg_match_all('/(a)*/', str_repeat('a', 1000), $matches);
(编辑:更改正则表达式以使其更简单,同时仍然崩溃)
我使用Apache 2.0在PHP 5.3.5上运行它,它崩溃了服务器。如果我将339更改为338它不会再崩溃,所以对我来说这似乎是个错误。我尝试将其报告给http://bugs.php.net/,但它已经失效了。这是一个PHP错误吗?是否会让其他人崩溃?
修改:将代码更改为
preg_match_all('/(?:a)*/', str_repeat('a', 339), $matches);
在崩溃之前允许更长的字符串。 如果它没有崩溃,请尝试将字符串长度增加10或100倍,因为这可能是内存问题,并且您可能有更多内存。
编辑2:崩溃是一个完整的流程崩溃,在Windows 7上,我在执行后立即收到“结束任务”消息。
编辑3:如果崩溃是由于太多的回溯,而上面的例子显然可能导致它,则以下情况不应该:
preg_match('/[^"\']*(;|$)/',
str_repeat('x', 1000), $matches);
这是我崩溃的实际代码。它只是意味着按;
拆分多个SQL查询,同时在单引号或双引号内允许;
。为什么这会引起如此多的回溯,我该如何解决呢?
答案 0 :(得分:4)
问题不在于内存或执行时间......
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);
}
?>