出现了一个PHP脚本占用系统内存50%

开始认为是哪个变量PHP没有自动释放,查看代码,里面有个类的函数是static的,加了设置为Null和unset后无效果。

用memory_get_usage方法一测试,才发现在每次数据库读取都会增加内存。

看了db类找到原因了,原来db对象是放在全局里的,在数据库读取时会在他里面记录下执行的SQL。全局的程序没有执行完毕是不会释放的,这个脚本又是常驻内存执行的,解决方法也简单取消记录这个SQL就可以了。

 

经验:对于全局变量在循环调用里的内存使用要注意

 

<?php
class db
{
    public $sql;

    public function query($sql)
    {
        $this->sql[] = $sql;
    }
}

$db = new db();
while(1) {
    echo "m1:".memory_get_usage()."\n";
    $db->query("select * from table");
    echo "m2:".memory_get_usage()."\n";
    usleep(10000);
}


显然这不是内存泄漏的BUG,只是代码编码的问题。

随便搜索了一下,还真发现一个内存泄漏的BUG,

http://hi.baidu.com/thinkinginlamp/blog/item/e400f819a3caab7cdbb4bd4e.html

上一篇: 批量转换字符编码perl脚本iconvs-v0.5.pl   下一篇: nginx设置404时如何使用判断条件

提交疑问

回顶部