YII フレームワークを使用して PHP スクリプトを実行しています。このスクリプトはデータベースを通過し、エクスポート用の Excel シートを作成します。データベース内のデータは現在約 15,000 レコードであり、増加しています。問題は、スクリプトが大量のメモリを消費し、生成される Excel ファイルが約 45 MB になることです。ファイルを zip して、問題になるとは思わないサイズに圧縮することはできますが、より多くのメモリを使用するスクリプトが私の懸念事項です。
私が考えていた解決方法の 1 つは、一度に 5,000 件のレコードだけを処理し、それらをすべて加算して Excel ファイルを作成することでした。これがその道なのかどうかはわかりません。
public function actionExport() {
Yii::import('ext.phpexcel.XPHPExcel');
XPHPExcel::init();
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Adding data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'SN')
->setCellValue('B1', 'Full Name')
->setCellValue('C1', 'Gender')
->setCellValue('D1', 'Date Of Birth')
->setCellValue('E1', 'Products')
$merchantModels = Merchant::model()->findAll();
$i = 2; //starting after the header row
foreach ($merchantModels as $model) {
$merchantPModels = MerchantProducts::model()->findAll(array(
'condition' => 'merchantID = :merchantID',
'params' => array(':merchantID' => $model->id),
));
$productStr= "";
$pStr ="";
$x = 0; // counter for the merchnat product Loop
foreach ($merchantModels as $MPmodel) {
if($MPmodel->product !== null){
$pStr = $MPmodel->product->productName;
}else{
$pStr = "";
}
if ($x == 0) { // First Object
$productStr = $pStr;
}else{
$productStr = $productStr . "," . $pStr;
}
$x++;
}
*
*/
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A' . $i, $i - 1)
->setCellValue('B' . $i, $model->fullName)
->setCellValue('C' . $i, $model->gender)
->setCellValue('D' . $i, $model->dateOfBirth)
->setCellValue('E' . $i, $productStr);
$i++;
}
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Merchants');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$date = new DateTime('NOW');
$date = $date->format('Y-m-d H:i:s'); // for example
$this->render('export', array(
'excelModel' => $objPHPExcel,
'date' => $date,
));
}