preg_match_all crash Apache

今天遇到一个诡异的问题,折腾了好久。

有一段 html,需要用正则表达式匹配一对标签内的所有文本,用到了 preg_match_all。

一直都没什么问题,但是今天修改了 html 的内容,再次运行的时候 Apache 突然 crash。

换用命令行执行,却没问题。

一步一步跟踪,发现问题出在 preg_match_all 身上。

为什么命令行执行正常,到了 Apache 就崩溃呢?

去 Google 搜了下 “apache preg_match_all”,发现果然有人遇到了这样的问题。

其中有一条是 https://bugs.php.net/bug.php?id=47689

意思是 Apache 的 stack 的 size 在各个平台下都不一样,可以用下面的指令设置 ThreadStackSize :

<IfModule mpm_winnt_module>
ThreadStackSize 8*1024*1024
</IfModule>

我试了下,没用!

不过算是有了参考思路,应该是 preg_match_all 内部递归的时候层次太深,达到了 Apache 允许的最大堆栈层次,Apache 果断退出!

这应该是 Windows 版 Apache 特有的问题,我在 Linux 下的 Apache 运行同样的程序,就可以成功得到结果。

有意思的是,这个网页上面还提供了一个范例程序,我把它搞出来供大家下载测试:

http://leakon.googlecode.com/svn/trunk/php/apache_crash/apache_crash.php

综上,得出结论是通过 Apache 没法执行这个程序了。

但问题还要解决,临时想了个土办法,测试通过了,给大家分享过程:

(1)把要解析的文本写入临时磁盘文件
(2)用 system 执行命令行程序读取这个文件,仍然用 preg_match_all 解析
(3)把解析结果序列化存入刚才这个文件
(4)在 Apache 的 php 中读取这个文件,并反序列化
(5)删掉这个临时文件

实在是没办法了。。。

 

Tags:

2 comments

Leave a Reply

Your email address will not be published.

*