我正在尝试使用google API在地图上显示用户。现在,当用户数增加到12000时,我收到内存异常错误。目前我将内存从128增加到256.但我确信当它的25000个用户再次出现相同的错误时。
错误是,
{/ 1}} /var/www/html/digitalebox_v2_20150904_100/protected/extensions/bootstrap/widgets/TbBaseMenu.phpFatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 30720 bytes)
line 193 on
致命错误:类声明可能不是嵌套的{{1} } / var / www / html / yii-1.1.14.f0fee9 / framework / collections / CListIterator.php
第20行
我的代码,
$ criteria = new CDbCriteria();
$ criteria-> condition ='t.date BETWEEN:from_date AND:to_date';
$ modelUsers = User :: model() - > findAll($ criteria);
foreach($ modelUsers as $ modelUser){
$ fullAddress = $ modelUser-> address1。 ','。 $ modelUser-> zip。 ''。 $ modelUser-> city。 ','。国家::模型() - > findByPk($ modelUser-> COUNTRYCODE) - >国家名称;
}
当这个in
有12000个记录时,这个内存问题来自它的12000个用户对象。
我该怎样做以防止将来出现这类问题? php应用程序运行所需的最小内存大小是多少?
答案 0 :(得分:4)
当您调用findAll时,它会及时加载所有记录,因此您会收到内存错误。在这种情况下,Yii有CDataProviderIterator。它允许对大型数据集进行迭代,而无需将整个集合保存在内存中。
.docx
答案 1 :(得分:3)
我以完全不同的方式解决了这个问题。我抛弃了整个模型概念,并且我在查询MySQL的地址。您可以查询MySQL,以便它返回已连接的地址,这意味着您可以避免在PHP中连接它 - 这可以避免浪费内存。
下一步将使用PDO
并发出无缓冲的查询。这意味着PHP进程不会将整个12 000条记录存储在其内存中 - 这就是如何避免耗尽内存。
最后一步是输出结果 - 当你遍历无缓冲的查询时,你可以一次输出一行(或10行)。
这种方式发生的事情是您将CPU换成RAM。由于您不知道需要多少RAM,因此最好的方法是尽可能少地使用。
使用无缓冲的查询和刷新PHP的输出缓冲区似乎是唯一可行的用例,看你无法输出大量数据。
答案 2 :(得分:2)
也许更多地增加内存,看看是否能解决问题。尝试将其设置为512M或1024M。我会根据自己的经验告诉你,如果你试图加载谷歌地图标记,那么标记的数量可能会使地图崩溃。
答案 3 :(得分:0)
在memory_limit
中增加php.ini
的值。然后重启Apache或运行的PHP。请记住,您在此处添加的内容需要从在同一台计算机上运行的其他程序(例如MySQL及其innodb_buffer_pool_size
)中删除。