这里写自定义目录标题
- 问题描述
- 问题解决
问题描述
新增了 Spreadsheet
用于写 excle
文件。
从网上查找一些实例后,封装成 createExcelFormData
函数如下:
php">/*** @brief 按照指定的键,将 array2(关联数组) 合并到 array1(关联数组)* @param mixed $data 数据数组,其中第一行表示行头* @param mixed $path 输出路径* @param mixed $filename 表格名称* @param mixed $key 0=成功,其他=失败* @return array(关联数组)*/
function createExcelFormData($data, $path, $filename)
{if(!mkDirs($path)){return -1;}// Create new Spreadsheet object$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();// Set active sheet$sheet = $spreadsheet->getActiveSheet();// Add data rows$sheet->fromArray($data, null, 'A1');// Save Excel file$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);$writer->save($path . "/" . $filename);
}
自测发现,在每次执行一次导出日志写excel后,内存不断增加如下:
问题解决
经分析和查找一些文档后发现:Spreadsheet写excel表格的是存在缓存机制,缓存在函数执行完成后并不会释放。
对于一些需要清空缓存的场景,需要增加清空缓存语句:PhpOffice\PhpSpreadsheet\Settings::getCache()->clear();
修改后的createExcelFormData
函数如下:
php">/*** @brief 按照指定的键,将 array2(关联数组) 合并到 array1(关联数组)* @param mixed $data 数据数组,其中第一行表示行头* @param mixed $path 输出路径* @param mixed $filename 表格名称* @param mixed $key 0=成功,其他=失败* @return array(关联数组)*/
function createExcelFormData($data, $path, $filename)
{if(!mkDirs($path)){return -1;}// Create new Spreadsheet object$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();// Set active sheet$sheet = $spreadsheet->getActiveSheet();// Add data rows$sheet->fromArray($data, null, 'A1');// Save Excel file$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);$writer->save($path . "/" . $filename);// 清空和释放缓存PhpOffice\PhpSpreadsheet\Settings::getCache()->clear(); // 一定要释放cache,否则会导致内存不断增长!!!unset($spreadsheet);unset($writer);
}