我正在使用Yii 1.1.14和php 5.3在centos 6上我使用CDbCommand从一个非常大的表中获取数据,结果集是10个列的~90,000个记录我将它导出到csv文件并且文件大小约为15MB, 脚本总是崩溃而没有任何错误消息,只有经过一些研究后我发现我需要在php.ini中提高memory_limit才能成功执行脚本。 唯一的问题是,为了成功执行,我必须将内存限制提高到512MB(!),这是很多!如果10个用户将执行相同的脚本,我的服务器将不会很好地响应......
我想知道是否有人可能知道使用Yii减少sql查询的内存消耗的方法? 我知道我可以使用限制和偏移将查询拆分为多个查询,但15MB查询消耗512MB似乎不合逻辑。
以下是代码:
set_time_limit(0);
$connection = new CDbConnection($dsn,$username,$password);
$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$result = $command->queryAll(); //this is where the script crashes
print_r($result);
任何想法都将不胜感激!
谢谢,
答案 0 :(得分:5)
不是使用readAll来返回单个数组中的所有行(这里存在真正的内存问题),而应该只使用foreach循环(请查看CDbDataReader),例如: :
$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$rows = $command->query();
foreach ($rows as $row)
{
}
编辑:使用LIMIT
$count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM TEST_DATA')->queryScalar();
$maxRows = 1000:
$maxPages = ceil($count / $maxRows);
for ($i=0;$i<$maxPages;$i++)
{
$offset = $i * $maxRows;
$rows = $connection->createCommand("SELECT * FROM TEST_DATA LIMIT $offset,$maxRows")->query();
foreach ($rows as $row)
{
// Here your code
}
}