yii2 mpdf下载pdf文件配合ZipArchive压缩的性能优化和采坑经验

本文档介绍了在Yii2框架中,利用mpdf生成包含中文名的PDF文件,并通过ZipArchive进行压缩的业务流程。在实际操作中遇到文件名编码、文件创建方式及压缩文件覆盖等问题,文中详细阐述了这些问题及其解决方案,包括避免多次重命名影响性能的方法,以及在不同环境下压缩文件处理的注意事项。
摘要由CSDN通过智能技术生成

一、基本准备

1. 环境配置:

语言:PHP:7.0.9
服务器:Apache:2.4
框架:Yii2

2. 前提条件

项目里安装好mpdf插件,
可以使用composer require "mpdf/mpdf": ">=7.0"进行安装
查看mPDF官方手册
查看mPDF的GitHub

3. 业务需求

  • 后台列表页面,根据搜索结果进行下载pdf文件,最终打包成压缩文件,进行下载
  • 每条数据为一个pdf文件
  • pdf的文件名包含中文字符(A232131-张三.pdf)

在这里插入图片描述

4. 采坑点及业务难点

  1. 往压缩文件里添加文件时$zip->addFile($savePath. $dir_name, $dir_name),参数1(文件名)不得含有中文.
  2. 解决上述问题时,当时没想着文件名用拼接的方式,一直穿,完整的再使用iconv()方法进行转编码,问题是可以解决,但是会非常影响性能,因为多次进行重命名.查看当时思路来源.后面会附上当时使用转编码及扫描文件的方式执行成功的代码,1000多条数据就得5分钟.
  3. 创建xxx.zip文件时,使用 touch($zipPath)进行创建. 不能使用fopen($zipPath, "w")进行创建,否则后面在执行$zip->close()时候会无法关闭.
  4. 压缩文件地址$zipPath,一开始使用静态地址,本地环境(Windows)重新生成压缩包的话,会覆盖旧的压缩文件,但是在线上(linux)环境下,会无法覆盖文件,导致每次下载,都会将旧的压缩文件地址返回.

二、业务过程

1. 第一步:将每条数据根据视图文件渲染,生成一个pdf文件,保存在服务器上

/**
 * 导出pdf
 */
public function actionExportPdf()
{
   
    set_time_limit(0);
    ini_set('memory_limit', '1024M');

    $this->response->format = Response::FORMAT_JSON;
    $searchModelClass = $this->searchModelClass;
    $searchModel = new $searchModelClass();
    $params = $this->request->queryParams;
   
    // 设置分页信息
	$params['per-page'] = 50;
	$params['page'] = 1;
	Yii::$app->request->setQueryParams($params);
	$dataProvider = $searchModel->search($this->request->queryParams);
	$dataProvider->getModels();
	$pages = $dataProvider->getPagination();
    $pageCount = $pages->pageCount;

    // pdf文件资源路径
    $time = date("YmdHis", time());
    $uploadPath = Yii::getAlias(Yii::$app->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值