这个PHP代码是否会让Apache崩溃?

时间:2011-06-17 06:51:49

标签: php apache crash

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查询,同时在单引号或双引号内允许;。为什么这会引起如此多的回溯,我该如何解决呢?

1 个答案:

答案 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);
}

?>