PHP允许的内存大小内存大小已耗尽

时间:2015-09-04 12:49:06

标签: php mysql performance memory yii

我正在尝试使用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应用程序运行所需的最小内存大小是多少?

4 个答案:

答案 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)中删除。