Laravel Octane(Swoole)因cwd问题无法下载PDF,如何全局设置工作目录?
解决Laravel Octane(Swoole)下dompdf生成PDF的cwd为空问题
核心原因
切换到Swoole环境后,Octane的worker进程当前工作目录(cwd)被清空,导致dompdf依赖的Symfony Process无法找到有效工作目录,触发“The provided cwd "" does not exist.”错误。
解决方法
1. 通过Octane启动钩子全局设置cwd
在项目的bootstrap/app.php文件中,添加Octane启动回调,为所有Swoole worker进程设置统一的工作目录:
use Laravel\Octane\Facades\Octane; Octane::starting(function ($server) { // 将工作目录设为项目根目录 chdir(base_path()); });
这个回调会在每个Swoole worker进程启动时执行,确保所有进程的cwd都指向项目根目录,从根源解决Symfony Process的路径问题。
2. 直接指定dompdf临时目录(额外防护)
为避免后续路径依赖问题,可直接配置dompdf使用自定义临时目录,不依赖进程cwd:
- 先发布dompdf配置文件(如果未发布):
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" - 打开
config/dompdf.php,修改temp_dir配置:'temp_dir' => storage_path('app/dompdf/temp'), - 创建对应目录并设置权限:
mkdir -p storage/app/dompdf/temp chmod -R 775 storage/app/dompdf/temp
验证设置是否生效
在生成PDF的代码前,临时添加代码检查当前工作目录:
dd(getcwd());
如果输出项目根目录的绝对路径,说明cwd设置成功。
内容的提问来源于stack exchange,提问作者prajwal_stha
相关产品推荐
相关产品推荐

