preg_replace_callback出现内存泄露。有人解决了么?

potency 2014-05-14 03:23:46
环境:php5.4.22 +centos 5.4+nginx
--------------------------------------------------------------------------------------------------------------
下面这个问题发现的:http://bbs.csdn.net/topics/390784375
----------------------------------
同样问题:
http://bbs.csdn.net/topics/390693060
----------------------------------------------------------------------
测试代码:

<?php
$content='<php>asdfsadf</php><php>asdfsadf</php><php>asdfsadf</php><php>asdfsadf</php><php>asdfsadf</php><php>asdfsadf</php> testtest';
$a=123;
$content= preg_replace_callback('/<php(\s*?)>(.*?)<\/php(\s*?)>/is', function($match) use($a){return 123;}, $content);
echo $content;

----------------------------------------------------运行结果-----------------------
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 3086503041 bytes) in /data/web/partTime/test2.php on line 4

---------------------------------------------
...全文
957 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2014-06-03
  • 打赏
  • 举报
回复
既然 preg_replace_callback 会有内存泄露 那么应该在任何文件中都是这样的 你可以单独用一个文件测试一下
$content = preg_replace_callback('/[a-z]/', function  ( $matches )  {
                        return strtoupper($matches[0]);
                    }, 'abdfrew');
echo $content;
与之等价的分立代码为
$content = 'abdfrew';
preg_match_all('/[a-z]/', $content, $matches );
foreach($matches[0] as $v) $r[$v] = strtoupper($v);
$content = strtr($content, $r);
echo $content;
先分别运行一下,看有无问题
potency 2014-06-03
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
如果是: 先 preg_match_all 再 preg_replace 也会出问题吗?
怎么实现的? 原框架错误代码如下:注意【preg_replace_callback】的使用


                if (! $closeTag)
                {
                    $patterns = '/' . $begin . $parseTag . $n1 . '\/(\s*?)' . $end . '/is';
                    $content = preg_replace_callback($patterns, function  ( $matches ) use( $tLib , $tag , $that )
                    {
                        return $that->parseXmlTag($tLib, $tag, $matches[1], $matches[2]);
                    }, $content);
                } else
                {
                    $patterns = '/' . $begin . $parseTag . $n1 . $end . '(.*?)' . $begin . '\/' . $parseTag . '(\s*?)' . $end . '/is';
                    for ($i = 0; $i < $level; $i ++)
                    {
                        $content = preg_replace_callback($patterns, function  ( $matches ) use( $tLib , $tag , $that )
                        {
                            return $that->parseXmlTag($tLib, $tag, $matches[1], $matches[2]);
                        }, $content);
                    }
                }
xuzuning 2014-05-14
  • 打赏
  • 举报
回复
如果是: 先 preg_match_all 再 preg_replace 也会出问题吗?
xuzuning 2014-05-14
  • 打赏
  • 举报
回复
那就等待他修复就是了 如果有能力,自己修复也可以
potency 2014-05-14
  • 打赏
  • 举报
回复
很多人提交 这个bug了,我去看过了。
xuzuning 2014-05-14
  • 打赏
  • 举报
回复
最新 php5.4 是 php5.4.22 尝试回调函数不使用闭包形式 如果依然不能解决问题,可去 php 的 bug 网站提交 bug

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧