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

时间:2012-06-14 09:34:48

标签: php wordpress memory-management

我偶然发现了一些有关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

为什么内存使用率如此高峰?这不是有点奇怪吗?

也许最重要的问题是,我可以采取哪些措施来降低使用率?

2 个答案:

答案 0 :(得分:0)

数据库的每一行都打包成一个对象/哈希,每个值都有一个哈希键和值本身,所以这会产生很多开销。

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

2)get_results()有第二个参数,用于控制你得到的东西。如果使用ARRAY_N,则将结果作为数组数组得到,这应该具有最小的开销。

wpdb#SELECT_Generic_Results

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

答案 1 :(得分:0)

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

如果没有分析,并且大胆猜测,您有多种选择:

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

奖金(正如Meier所说):检查您是否需要SELECT子句中的每个字段,而不是select *

希望这有帮助!