这里写自定义目录标题
- 问题描述
- 问题解决
问题描述
新增了 Spreadsheet
用于写 excle
文件。
从网上查找一些实例后,封装成 createExcelFormData
函数如下:
/**
* @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
函数如下:
/**
* @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);
}