我有以下代码:
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重置为空数组? 不确定,但欢迎任何建议。 谢谢。
答案 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