我前些日子在 php5.2.0 下面写了一个程序,因为需要,需要大量使用preg_match_all的正则方式对文本进行处理。
搞好后传后虚拟主机上(php5.2.6),结果一跑到preg_match_all函数php就崩溃,apach直接报错,终止。我看了一下,如果我在preg_match_all中用简单的正则问题不大,一用复杂点的正则,还有处理的数据包一大,就会出现这个问题,我处理的数据包如果是1-2K问题不大,再大一点的就会出错。我用的正则:$sRule = '/(<table(?:.(?<!<table))*首\s*页.*?<\/table>)/ism';实际上这个也不是很复杂。后来我在本机装了php5.3.0,结果也同样,运行的时候跑到preg_match_all,apach就会意外终止,只有在php5.2.0上跑才正常。我网上查了一下关于preg_match_all的Bug方面的资料,看到有人遇到过类似问题,说是preg_match_all这个函数堆栈太小导出出错:http://jackywdx.cn/2009/05/solution_to_segmentation_fault_using_preg_match_all/但是我不知道在windows上怎么处理,他这个是在unix上的处理方式。有人知道怎么处理这个问题吗?求救了。<?php
function loadf($sFilePath)
{
    $hdlSrc = @fopen($sFilePath, 'rb');//源文件链接   
    if ($hdlSrc == false)
        return null;//源文件最终打开失败
    else
    {
        $aBuf = array();
        while(!feof($hdlSrc)) 
            $aBuf[] = fread($hdlSrc, 8*1024);//写入读取到的数据
        fclose ($hdlSrc);
        
        return join('', $aBuf);//输出文件内容
    }
}$sTmp = loadf('9c3bb7bb57c872253a821798fcdc1a07.html');
$sRule = '/(<table(?:.(?<!<table))*首\s*页.*?<\/table>)/ism';
echo strlen($sTmp);if(preg_match_all($sRule, $sTmp, $aResult, PREG_PATTERN_ORDER))/*就是这个地方apach意外终止的*/
    print_r($aResult);
else 
    echo '没有过滤';
?>

解决方案 »

  1.   

    Windows下可以使用EditBin修改堆栈大小,下面是参考:
    http://msdn.microsoft.com/en-us/library/xd3shwhf%28VS.80%29.aspx
      

  2.   

    唉,太复杂了,呵呵。
    我还是装回php5.2.0了,这个版本是正常的
      

  3.   

    没看明白你倒底要用正则完成什么样的数据 抽出...有些功能可以用 php 语言完成的,尽量用PHP完成.没有必要都用正则来一次性完成..
      

  4.   

    我两一样的,去看我的帖子。跟你的一样的问题。
    http://topic.csdn.net/u/20090904/18/cf36b4ce-fbb6-4533-9f24-56e9ebb307a3.html?seed=616806743&r=59572892#r_59572892  我的PHP 5.2.0不行。照样出错。我找了一些帖子。说是要修改pcre的堆栈大小。[Pcre]
    pcre.recursion_limit=10000000
    pcre.backtrack_limit=10000000这是我修改后的值,原本是 100000 呵呵。试试看吧。
      

  5.   

    http://www.tctd.cc/bbs/viewthread.php?action=printable&tid=5485这是原文地址。