<?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
到此我有个疑问,为什么进程的内存没有被释放?
呼叫群主大大
workerman里内存统计使用的是 memory_get_usage(true);
你的测试简本里把参数true加上试下
群大你好,我使用memory_get_usage(true)测试了,发现最后输出的memory_get_usage(true)返回结果没有了memory_get_usage()的变化那么大了;其实我的问题是,我的项目使用了Workerman的Webserver,然而最近发现进程的内存不断的增长,我已经确认了不是项目里的$GLOBALS全局变量的问题,也给PHP安装了event扩展和Linux调优。折腾了很久,才发现只要查询数据库数据时,进程的内存就无法释放,一开始我肯定觉得是我代码问题,然后我就独立的写了一个demo(就是以上),测试了发现资源没有被释放,,,
memory_get_usage(true)这样获得的结果差别很大了
这个应该和workerman没有关系。可能是PDO有自己的内存管理机制,使用后内存并不释放,下次复用,提高性能。
你可以写个test.php ,里面不用workerman,就一个测试pdo的脚本,看下内存是否释放。
测试完毕,确认不是workerman的问题,是PDO的一些机制问题。我再想想其他办法吧
这部分内存pdo应该会重复利用的,所以应该不会一直增长,一般情况下不用担心。