【发布时间】:2015-11-30 15:20:50
【问题描述】:
我正在尝试使用 google API 在地图上显示用户。现在,当用户数增加到 12000 时,我得到了一个内存异常错误。目前我将内存从 128 增加到 256。但我确信当它的 25000 用户再次出现同样的错误时。
错误是,
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 30720 bytes) in /var/www/html/digitalebox_v2_20150904_100/protected/extensions/bootstrap/widgets/TbBaseMenu.phponline 193
致命错误:类声明不能嵌套in/var/www/html /yii-1.1.14.f0fee9/framework/collections/CListIterator.phponline 20`
我的代码,
$criteria = 新 CDbCriteria();
$criteria->condition = 't.date BETWEEN :from_date AND :to_date';
$modelUsers = User::model()->findAll($criteria);
foreach ($modelUsers 作为 $modelUser) {
$fullAddress = $modelUser->address1 。 ',' 。 $modelUser->zip 。 ' ' 。 $modelUser->城市。 ',' 。 Country::model()->findByPk($modelUser->countryCode)->countryName;
}
当这个 $modelUsers 有 12000 条记录时,这个内存问题来自它的 12000 个用户对象。
我应该怎么做以防止将来出现此类问题?运行 php 应用程序所需的最小内存大小是多少?
【问题讨论】:
-
为什么要选择所有用户,而不仅仅是您需要的数据?解决此问题的方法是向数据库询问相关数据。您不必使用模型解决所有问题。查询地址然后在地图上显示 25000 个地址并没有错,尽管这也是相当多的数据(人类可以在一张地图上区分所有 25000 人?)。
-
这是一个公平的观点
-
我仍然需要过滤器的数据来自大约 12000 条记录。
-
你会处理所有的 12000 吗?您要求所有列吗?或者只是您将使用的列?
-
假设你需要处理12K,分块读取和处理。请记住,每行中的每个字段在 PHP 中占用 40 个字节或更多。
标签: php mysql performance memory yii