gpt4 book ai didi

PHP->PDO() 大约 500 字节内容的查询突然需要 100 MB 的 PHP 内存

转载 作者:行者123 更新时间:2023-11-29 02:42:44 25 4
gpt4 key购买 nike

我重启了服务器并发生了一些变化。

使用 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];

当我将 MAX_BUFFER_SIZE 增加到 60MB 时,我注意到了这个错误。突然我的应用程序超过了 140MB 内存。它似乎使用 max_buffer_size 作为 MIN_buffer_size*3

似乎 PDO 使用 3 倍的 max_buffer_size 变量作为微小查询的存储缓冲区。这根本没有意义..

这是 PHP 5.6.30

我只是不知道该去哪里找,我将其调试为单个查询,现在我卡住了,这是一个 PHP 内部分配。

更新该问题可能在重新启动之前就已经存在,只是没有引起注意。我不知道是什么触发了它,但是将库更改为 php-mysqlnd 解决了它。不再使用内存。

最佳答案

看来是php-mysql驱动的一个bug,根据MAX_BUFFER属性分配大量内存,使用PDO时不再释放。
我切换到 native 驱动程序 mysqlnd,问题消失了。

关于PHP->PDO() 大约 500 字节内容的查询突然需要 100 MB 的 PHP 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com