无法释放进程内存

yepo
<?php

use PDO;
use Workerman\Worker;
require_once 'Workerman/Autoloader.php';

$w = new Worker();
$w->onWorkerStart = function(){
    echo memory_get_usage()."\n";
    $set = Config::getItem('db');
    $pdo = new PDO(
        $set,
        $set,
        $set,

    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $pdo->prepare("SELECT * FROM orders", );
    $stmt->execute(null);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $data = $stmt->fetchAll();
    $stmt = null;
    echo memory_get_usage()."\n";
    unset($data);
    echo memory_get_usage()."\n";
};

Worker::runAll();开启服务前,通过php a.php status查看进程的占用内存是4M
查询了数据库,然后把结果变量unset了,通过memory_get_usage()查看内存是被释放了,但是再次php a.php status查看进程的占用内存是72M
到此我有个疑问,为什么进程的内存没有被释放?
 

3872 4 0
4个回答

yepo

呼叫群主大大

  • 暂无评论
walkor

workerman里内存统计使用的是 memory_get_usage(true);
你的测试简本里把参数true加上试下

  • yepo 2019-06-16

    群大你好,我使用memory_get_usage(true)测试了,发现最后输出的memory_get_usage(true)返回结果没有了memory_get_usage()的变化那么大了;其实我的问题是,我的项目使用了Workerman的Webserver,然而最近发现进程的内存不断的增长,我已经确认了不是项目里的$GLOBALS全局变量的问题,也给PHP安装了event扩展和Linux调优。折腾了很久,才发现只要查询数据库数据时,进程的内存就无法释放,一开始我肯定觉得是我代码问题,然后我就独立的写了一个demo(就是以上),测试了发现资源没有被释放,,,

yepo

memory_get_usage(true)这样获得的结果差别很大了

  • 暂无评论
walkor

这个应该和workerman没有关系。可能是PDO有自己的内存管理机制,使用后内存并不释放,下次复用,提高性能。
你可以写个test.php ,里面不用workerman,就一个测试pdo的脚本,看下内存是否释放。

  • yepo 2019-06-16

    测试完毕,确认不是workerman的问题,是PDO的一些机制问题。我再想想其他办法吧

  • walkor 2019-06-16

    这部分内存pdo应该会重复利用的,所以应该不会一直增长,一般情况下不用担心。

年代过于久远,无法发表回答
🔝