Yii CDbCommand query在尝试检索大数据集时全部崩溃



我正在使用 Yii 1.1.14,我正在尝试从 oracle 11.2 数据库中检索一个大数据集(~80,000 条记录/10 列(。

我的问题是整个脚本在几分钟后崩溃而不会触发任何错误/异常。我还检查了php和apache日志,但没有迹象表明有任何错误。

该脚本是从浏览器执行的,我只得到一个没有数据的空白页。

这是代码:

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);
//Please disregard any typos, I pasted only a portion of the code.

经过一些调试,我意识到脚本在 $command->queryAll(( 行上失败,但是当我将限制设置为 60,000 条记录(~9MB 文件(时,脚本不会失败,并且我会在页面上打印结果,所以我知道代码工作正常。

怀疑崩溃与内存消耗有关,但通常它会触发错误,我尝试将 php.ini 中的memory_limit提高到 256MB,但这并没有解决它。我还尝试将错误报告设置为E_ALL,以尝试引发任何错误/异常。

我在 centos 6 服务器上使用 apache 和 php 5.3。

完全没有想法,如果这里有人可以帮助我,我将不胜感激。

编辑:我发现了问题,这是一个内存问题,我发现对于 ~10MB 的结果集/10MB 文件,您需要将 php 的内存限制设置为 256MB.ini(这很多!(,我想我不将使用 Yii AR,而是发出一个简单的 php 命令。

我很难想象必须在页面上打印 60K 记录的情况。我建议您不要做findAll()而是使用分页结果,如CGridViewCListView

$dataProvider=new CActiveDataProvider( TestData::model() );
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
));

重写代码非常简单。 例如,如果您正在做(即使有范围(

TestData::model()->published()->top(5)->findAll()

只是切断最后一部分,你就有一个论据CActiveDataProvider构造者

new CActiveDataProvider( TestData::model()->published()->top(5) );

更新

尝试按部分查询:

$limit = 1000 ;
$passes = ceil( Yii::app()->db->createCommand( 'SELECT COUNT(*) FROM {{test_data}}' )->queryScalar() / $limit ) ;
for ( $pass = 0 ; $pass < $passes ; $pass++ ) {
    $command = Yii::app()->db->createCommand()
        ->select('*')
        ->from( '{{test_data}}' )
        ->limit( $limit )
        ->offset( $pass * $limit ) ;
    $result = $command->queryAll() ; // here is your peace of data
}

最新更新