Laravel项目部署Windows IIS后上传图片报错:Unable to launch a new process
Laravel上传图片报错“Unable to launch a new process”(Windows IIS+PHP8)
问题背景
Laravel项目在Linux环境运行正常,迁移至Windows Server IIS服务器后,升级PHP7到PHP8并更新依赖包,网站整体功能正常,但上传图片时触发RuntimeException: Unable to launch a new process,报错代码片段:
$process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options); if (!\is_resource($process)) { throw new RuntimeException('Unable to launch a new process.'); } $this->process = $process; $this->status = self::STATUS_STARTED;
已尝试调整上传文件夹权限、更新Composer,问题未解决。
排查与解决步骤
检查PHP配置是否禁用proc_open
打开php.ini,查找disable_functions配置项,确认其中没有proc_open。如果有,将其从列表中移除,重启IIS服务。验证命令行的可执行性
代码中$commandline对应的命令,需确保在Windows环境下能正常执行:- 使用Windows格式的绝对路径(比如
"C:\Tools\magick.exe convert input.jpg output.png"),避免依赖系统PATH或相对路径; - 直接在服务器命令提示符(CMD)中执行该命令,确认能正常运行,排除命令本身的错误。
- 使用Windows格式的绝对路径(比如
调整IIS应用池权限
- 将应用池的标识改为LocalSystem(测试用,生产环境可根据需求选择更安全的标识);
- 给应用池对应的用户(比如
IIS AppPool\YourAppPoolName)赋予以下权限:- 上传目录、PHP临时文件目录(php.ini中
upload_tmp_dir配置的路径)的读写权限; - 命令行工具所在目录的读取权限。
- 上传目录、PHP临时文件目录(php.ini中
调整Laravel Process组件的执行选项
在创建进程时,添加Windows适配的选项:use Illuminate\Support\Facades\Process; $process = Process::fromShellCommandline($commandline, $this->cwd, $envPairs); // 绕过shell直接执行命令,避免Windows shell解析问题 $process->setOptions(['bypass_shell' => true]); // 或者指定Windows的shell路径 // $process->setOptions(['shell' => 'C:\Windows\system32\cmd.exe']); $process->run();检查PHP临时目录权限
确认php.ini中的upload_tmp_dir配置的目录存在,且IIS应用池用户拥有读写权限。如果未配置,PHP会使用系统临时目录,同样需要确保权限足够。确认环境变量可用性
如果命令依赖系统环境变量(比如PATH),可在代码中手动注入所需的环境变量,或者在IIS应用池的高级设置中添加对应的环境变量配置。
内容的提问来源于stack exchange,提问作者Hassan M Elshikh
相关产品推荐
相关产品推荐

