You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)中执行该命令,确认能正常运行,排除命令本身的错误。
  • 调整IIS应用池权限

    • 将应用池的标识改为LocalSystem(测试用,生产环境可根据需求选择更安全的标识);
    • 给应用池对应的用户(比如IIS AppPool\YourAppPoolName)赋予以下权限:
      • 上传目录、PHP临时文件目录(php.ini中upload_tmp_dir配置的路径)的读写权限;
      • 命令行工具所在目录的读取权限。
  • 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:18:23