【发布时间】:2013-08-07 21:47:57
【问题描述】:
preg_match_all('/(a)*/', str_repeat('a', 1000), $matches);
(编辑:稍微更改一下正则表达式以使其更简单,同时仍然崩溃)
我在 PHP 5.3.5 和 Apache 2.0 上运行它,它使服务器崩溃。如果我将 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 查询,同时允许; 在单引号或双引号内。为什么这会导致如此多的回溯,我该如何解决?
【问题讨论】:
-
出现错误时崩溃?也许是内存限制?
-
发布您的 Apache 错误日志的相关部分
-
ini_set('max_execution_time', 1500); ini_set("memory_limit", "32M");
-
似乎没有让我的崩溃。对不起
-
啊,Windows。我的猜测是您的构建/它的 PCRE 库有问题。绝对是您的配置本地的。此外,不确定您为什么要编辑崩溃条件或告诉我们将其运行时间延长 100 倍——理想情况下,您希望隔离导致其崩溃的最简单/最短事物并从那里进行跟踪。跨度>