PHP 使用Spreadsheet写excel缓存导致内存不停增加

打印 上一主题 下一主题

主题 1011|帖子 1011|积分 3033

问题描述

新增了 Spreadsheet 用于写 excle 文件。
从网上查找一些实例后,封装成 createExcelFormData 函数如下:
  1. /**
  2. * @brief                   按照指定的键,将 array2(关联数组) 合并到 array1(关联数组)
  3. * @param mixed $data       数据数组,其中第一行表示行头
  4. * @param mixed $path       输出路径
  5. * @param mixed $filename   表格名称
  6. * @param mixed $key        0=成功,其他=失败
  7. * @return                  array(关联数组)
  8. */
  9. function createExcelFormData($data, $path, $filename)
  10. {
  11.     if(!mkDirs($path)){
  12.         return -1;
  13.     }
  14.     // Create new Spreadsheet object
  15.     $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
  16.     // Set active sheet
  17.     $sheet = $spreadsheet->getActiveSheet();
  18.     // Add data rows
  19.     $sheet->fromArray($data, null, 'A1');
  20.     // Save Excel file
  21.     $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  22.     $writer->save($path . "/" . $filename);
  23. }
复制代码
自测发现,在每次实行一次导出日记写excel后,内存不停增加如下:



问题办理

经分析和查找一些文档后发现:Spreadsheet写excel表格的是存在缓存机制,缓存在函数实行完成后并不会开释。
对于一些需要清空缓存的场景,需要增加清空缓存语句:PhpOffice\PhpSpreadsheet\Settings::getCache()->clear();
修改后的createExcelFormData函数如下:
  1. /**
  2. * @brief                   按照指定的键,将 array2(关联数组) 合并到 array1(关联数组)
  3. * @param mixed $data       数据数组,其中第一行表示行头
  4. * @param mixed $path       输出路径
  5. * @param mixed $filename   表格名称
  6. * @param mixed $key        0=成功,其他=失败
  7. * @return                  array(关联数组)
  8. */
  9. function createExcelFormData($data, $path, $filename)
  10. {
  11.     if(!mkDirs($path)){
  12.         return -1;
  13.     }
  14.     // Create new Spreadsheet object
  15.     $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
  16.     // Set active sheet
  17.     $sheet = $spreadsheet->getActiveSheet();
  18.     // Add data rows
  19.     $sheet->fromArray($data, null, 'A1');
  20.     // Save Excel file
  21.     $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  22.     $writer->save($path . "/" . $filename);
  23.     // 清空和释放缓存
  24.     PhpOffice\PhpSpreadsheet\Settings::getCache()->clear(); // 一定要释放cache,否则会导致内存不断增长!!!
  25.     unset($spreadsheet);
  26.     unset($writer);
  27. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表