生产服务器使用mPDF生成PDF时出现errno=21错误求助
针对你遇到的file_get_contents读取8192字节失败,errno=21(是一个目录)错误,以下是具体排查和解决方向:
检查reports目录状态与权限
生产服务器上,先确认reports目录是否存在,且PHP运行进程对该目录有写入权限。可以通过服务器命令行执行:ls -ld reports输出开头为
d表示是目录,同时确保所有者/权限允许PHP写入(比如权限设为755或775,根据服务器配置调整)。如果目录被误删或权限变更,会导致mPDF无法创建目标文件,进而触发路径解析错误。修正输出路径的相对/绝对问题
你使用的相对路径reports/report.pdf在生产环境的工作目录可能与本地不一致(比如脚本部署在子目录,相对路径指向了错误的位置)。建议改为绝对路径,例如:$outputPath = __DIR__ . '/reports/report.pdf'; // 基于当前脚本目录的绝对路径避免因工作目录差异导致mPDF误将某个现有目录当成目标文件路径。
排查mPDF临时目录配置
mPDF生成PDF时需要临时目录处理中间文件,若临时目录配置错误(比如指向了一个非目录路径,或权限不足),也会触发类似错误。可以手动指定临时目录:$mpdf = new \Mpdf\Mpdf([ 'tempDir' => __DIR__ . '/mpdf-temp' // 确保该目录存在且有写入权限 ]);同时检查系统默认临时目录(
sys_get_temp_dir()返回的路径)是否正常可用。排除代码/依赖变更影响
回顾最近是否更新了mPDF版本(通过composer show mpdf/mpdf查看版本差异),或修改了PDF生成脚本中的资源引用(比如图片、CSS文件路径)。若误引用了一个目录而非文件,会导致mPDF在读取资源时触发此错误。检查文件系统异常
确认生产服务器磁盘是否已满,或reports目录被意外修改为文件(通过ls -l reports查看,若开头不是d则说明被改成了文件)。磁盘满会导致无法创建PDF文件,进而触发路径解析错误。
注:upload_max_filesize是控制HTTP上传文件大小的参数,与PDF生成过程无关,调整它无法解决此问题。
内容的提问来源于stack exchange,提问作者user21102515

