• 技术文章 >php框架 >Swoole

    swoole 内存会越来越大吗

    (*-*)浩(*-*)浩2019-12-12 11:45:59原创1943

    Server内存管理机制

    Server启动后内存管理的底层原理与普通php-cli程序一致。具体请参考Zend VM内存管理方面的文章。

    局部变量 (推荐学习: swoole视频教程

    在事件回调函数返回后,所有局部对象和变量会全部回收,不需要unset。如果变量是一个资源类型,那么对应的资源也会被PHP底层释放。

    function test()
    {
        $a = new Object;
        $b = fopen('/data/t.log', 'r+');
        $c = new swoole_client(SWOOLE_SYNC);
        $d = new swoole_client(SWOOLE_SYNC);
        global $e;
        $e['client'] = $d;
    }

    $a, $b, $c 都是局部变量,当此函数return时,这3个变量会立即释放,对应的内存会立即释放,打开的IO资源文件句柄会立即关闭。

    $d 也是局部变量,但是return前将它保存到了全局变量$e,所以不会释放。当执行unset($e['client'])时,并且没有任何其他PHP变量仍然在引用$d变量,那么$d就会被释放。

    全局变量

    在PHP中,有3类全局变量。

    使用global关键词声明的变量

    使用static关键词声明的类静态变量、函数静态变量

    PHP的超全局变量,包括$_GET、$_POST、$GLOBALS等

    全局变量和对象,类静态变量,保存在Server对象上的变量不会被释放。需要程序员自行处理这些变量和对象的销毁工作。

    class Test
    {
        static $array = array();
        static $string = '';
    }
    function onReceive($serv, $fd, $reactorId, $data)
    {
        Test::$array[] = $fd;
        Test::$string .= $data;
    }

    在事件回调函数中需要特别注意非局部变量的array类型值,某些操作如 TestClass::$array[] = "string" 可能会造成内存泄漏,严重时可能发生爆内存,必要时应当注意清理大数组。

    在事件回调函数中,非局部变量的字符串进行拼接操作是必须小心内存泄漏,如 TestClass::$string .= $data,可能会有内存泄漏,严重时可能发生爆内存。

    以上就是swoole 内存会越来越大吗的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:swoole
    上一篇:swoole能做直播吗 下一篇:swoole 能配置证书吗

    相关文章推荐

    • swoole为什么高效• swoole是php的扩展吗• swoole服务怎么开启• swoole是服务还是框架

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网