我重新启动了服务器,有些东西变了。
突然之间,使用pdo到mysql的微小sql查询需要大约90mb的内存。它使用3倍的最高输入缓冲区。
MEM: 3586264 / 4718592
MEM: 96740584 / 98304000
MEM: 96740584 / 98304000
代码尽可能简单:
$a=memory_get_peak_usage(false);
$b=memory_get_peak_usage(true);
echo "MEM: $a / $b\n";
$pdo->query("SELECT * FROM `results` WHERE `customer_id` = '456' AND `jobname` = 'job1' LIMIT 1")
$a=memory_get_peak_usage(false);
$b=memory_get_peak_usage(true);
echo "MEM: $a / $b\n";
$pdo->query("SELECT * FROM `results` WHERE `customer_id` = '456' AND `jobname` = 'job1' LIMIT 1")
$a=memory_get_peak_usage(false);
$b=memory_get_peak_usage(true);
echo "MEM: $a / $b\n";
当然,我检查了查询,内容确实很小,只是一行几个varchar字段。
pdo的初始化方式如下: $opt = [PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 1024 * 1024 * 30];
当我将最大缓冲区大小增加到60mb时,我注意到了这个错误。突然,我的应用程序超过了140mb的内存。它似乎使用最大缓冲区大小作为最小缓冲区大小*3
pdo似乎使用了3倍于max\u buffer\u size的变量作为存储缓冲区来处理微小的查询。这一点意义都没有。。
它是PHP5.6.30
我只是不知道该去哪里找了,我把它调试成一个查询,现在我卡住了,那是一个php内部分配。
更新问题很可能在重新启动之前出现,只是没有被注意到。我不知道是什么触发了它,但是将库更改为php mysqlnd解决了这个问题。不再使用内存。
1条答案
按热度按时间6yjfywim1#
这似乎是php-mysql驱动程序中的一个驱动程序错误,它基于max\u buffer属性分配大量内存,并且在使用pdo时不再释放它。
我切换到本地驱动程序mysqlnd,问题就消失了。