Estoy creando un método para generar un archivo CSV que exporte más de 60 mil registros.
Anteriormente usaba EexcelBehavior y EexcelView pero la memoria del servidor se agotaba con miles de registros y cada vez que la aumentaba pedia más.
Para obtener los datos uso un CActiveDataProvider y es la parte donde tarda muchísimo les dejo mi código:
function ToCsv($model,$dataProvider, $columns){
$totalItemCount=$dataProvider->totalItemCount; // cantidad total de registros
$chunk= 1000; // cantidad de registros a obtener en el criteria
$fp = fopen( "/tmp/$fileName-".time() .'.csv', 'w+' ); //creo un archivo en tmp
fputs($fp,$this->HeaderCsv($columns) ); // agregó las columnas al archivo
for ( $i=0; $i < $totalItemCount; $i=$i+$chunk )
{
$dataProvider = new CActiveDataProvider($model,
array('criteria'=>$this->CriteriaLimit($criteria,$i,$chunk) ) // creo un nuevo dataprovider con un criteria limitado
);
$dataProvider->pagination = false; //deshabilito la paginación
$getData = $dataProvider->getData(); // aquí tarda muchisimo en obtener los datos
foreach ($getData as $data) {
foreach ($columns as $column) { // voy recorriendo cada columna del grid (personalizado)
$value .= !empty($column['value'])?
$data->evaluateExpression($column['value'], array('data'=>$data))."\t": //obtengo el valor de la relación del "value" de columns
$data[$column['name']]."\t";
}
$value =substr($value, 0,-1);
$value .=$newLine;
}
fputs($fp, $value);
}
rewind($fp);
$output = stream_get_contents($fp);
fclose($fp);
OutPutCsv($fileName,$output); // mando a descargar el archivo en el navegador
}
¿De que forma puedo optimizar mi metodo para que este soporte miles de registros y no agote la memoria del servidor?