PHP 内存使用量增加了 50mb,但结果集只有 ~7mb


PHP memory usage goes up 50mb but result set is only ~7mb

我偶然发现了一些关于PHP的有趣的记忆考虑这段代码(sql-result 大约是 18000 行)

echo memory_get_usage() . PHP_EOL;
echo 'Querying mysql' . PHP_EOL;
$result = $wpdb->get_results($sql);
echo memory_get_usage() . PHP_EOL;
echo PHP_EOL;
echo 'Size of result set' . PHP_EOL;
echo strlen(serialize($result)) . PHP_EOL;

输出:

33309232
Querying mysql
86203976
Size of result set
6838278

为什么内存使用量会像这样达到峰值?是不是有点奇怪?

也许最重要的问题是,我可以做些什么来降低使用率?

数据库的每一行都打包到一个对象/哈希中,每个值都有一个哈希键和值本身,因此这会产生大量开销。

您可以采取哪些措施来减少开销:1)一定要只选择你真正需要的列,不要只做select *

2)get_results()有第二个参数,你用它来控制你得到什么。如果使用 ARRAY_N ,则结果为数组数组,这应该具有最小的开销。

WPDB#SELECT_Generic_Results

3)如果这还不够,则需要批量获取数据,例如1000行。为此,您可以使用 sql 修饰符offsetlimit

只有使用 xdebug 进行基本分析才能查明实际内存使用情况。

没有分析,大胆猜测,你有多种选择:

  • 结果进行分页,即发送多个查询而不是一个大的查询
  • 使用ARRAY_N作为$wpdb->get_results($sql, ARRAY_N),更轻,更紧凑格式的输出格式

奖金(如迈尔所说):检查您是否需要 SELECT 子句中的每个字段,并且没有select *

希望这有帮助!