PHP循环中允许的内存大小耗尽

时间:2016-04-28 17:41:25

标签: php arrays

我有以下代码:

 15 $users = pg_fetch_all($result);
 16 $chart_data = array();
 17 foreach ($users as $value)
 18 {
 19         //var_dump($value);
 20         $temp = array();
 21         $temp['label'] = $value['id'];
 22         $temp['y'] = $value['sum'];
 23 print_r($temp);
 24 /*
 25 echo "<pre>";
 26         var_dump($temp);
 27 echo "</pre>";
 28 */      
 29         array_push($chart_data,$temp);
 30 }
 31 echo count($chart_data);

当我运行我的代码时,收到以下错误消息:

[Thu Apr 28 17:23:39.278844 2016] [:error] [pid 24321] [client 10.63.8.104:58362] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/localhost/htdocs/audit/index.php on line 21

这是我从print_r()得到的输出样本:

Array ( [label] => 12 [y] => 0.0021 ) 

我无法看到第21行如何成为问题。也许我需要明确地将temp重置为空数组? 不确定,但欢迎任何建议。 谢谢。

3 个答案:

答案 0 :(得分:3)

这是相当不言自明的,不是吗?您在每次迭代时对array_push执行$chart_data,因此 $chart_data会在每次迭代时变得更大。最终,随着您的服务器设置和数据的原样,您在结束之前就会耗尽内存。

处理较少的数据或为自己提供更多内存。您的PHP设置为您提供128MB,这是高但不疯狂。如果您确定需要,可以增加它。

另一种方法是重新考虑首先创建这个巨大阵列的需要。您似乎只是为了重命名密钥而这样做,这看起来非常浪费。考虑在数据库查询中重命名它们,以便它们从一开始就是您想要的。然后你可以按顺序遍历行,而不必一次将整个数据集读入内存。

答案 1 :(得分:1)

忽略内存问题,看起来您只是尝试将关联数组索引从列名更改为其他内容。尝试在SELECT中执行:

SELECT `id` AS label, `sum` AS y FROM `somewhere` . . .

然后您原来的$users = pg_fetch_all($result);应该包含您想要的内容。

答案 2 :(得分:-1)

你可以为所有人增加允许的内存,但我认为这对你有用

<?php
ini_set('memory_limit', '1024M'); // write this line before your code