首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个PHP代码会让其他人的Apache崩溃吗?

这个PHP代码会让其他人的Apache崩溃吗?
EN

Stack Overflow用户
提问于 2011-06-17 06:51:49
回答 1查看 1.7K关注 0票数 1
代码语言:javascript
复制
preg_match_all('/(a)*/', str_repeat('a', 1000), $matches);

(编辑:稍微修改regexp,使其在崩溃时更简单)

我在PHP5.3.5上使用Apache2.0运行它,它使服务器崩溃。如果我把339改为338,它就不会再崩溃了,所以在我看来,它就像是一个bug。我试着把它报告给http://bugs.php.net/,但是它坏了。这是PHP错误吗?对其他人来说会崩溃吗?

编辑:将代码更改为

代码语言:javascript
复制
preg_match_all('/(?:a)*/', str_repeat('a', 339), $matches);

允许在碰撞前使用较长的字符串。如果没有崩溃,请尝试将字符串长度增加10或100倍,因为这可能是内存问题,您可能有更多的内存。

编辑2:崩溃是一个完整的进程崩溃,在Windows7上,我在执行后立即得到“结束任务”消息。

编辑3:如果崩溃是由于过多的回溯造成的,而且上面的示例显然可以导致崩溃,那么下面不应该这样做:

代码语言:javascript
复制
preg_match('/[^"\']*(;|$)/',
               str_repeat('x', 1000), $matches);

这是我真正的代码崩溃了。它只是用来拆分;的多个SQL查询,同时允许;使用单引号或双引号。为什么这会导致这么多的回溯,我该如何修复呢?

EN

回答 1

Stack Overflow用户

发布于 2011-06-17 07:10:30

问题不是内存或执行时间..。

代码语言:javascript
复制
ini_set('pcre.backtrack_limit', 10000);

如果需要的话,可以随意地将 10000降到不同的值。有关更多信息,请参见http://php.net/manual/en/pcre.configuration.php

如果您想测试它崩溃的位置:

代码语言:javascript
复制
<?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);
}

?>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6382330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档