如何在Windows上通过PHP启动WSL的Linux可执行文件并捕获stdout?
你遇到的退出码 -1073740791 对应Windows系统STATUS_STACK_BUFFER_OVERRUN错误,绝大多数情况是PHP调用wsl时的路径、运行上下文不匹配导致的,可按以下方案逐一排查:
- 使用绝对路径调用wsl程序
你在cmd中执行的是带全路径的C:\wsl,但PHP运行环境的PATH环境变量和cmd登录用户的PATH不一致,直接写wsl会找不到程序,必须使用全路径调用。
如果你的wsl程序自定义存放在C盘根目录,修改命令为:
如果你使用的是系统默认安装的WSL,wsl.exe默认存放在C:\Windows\System32目录下:$cmd = 'C:\\wsl.exe echo "foo"';- 64位PHP直接使用路径:
C:\\Windows\\System32\\wsl.exe - 32位PHP会被系统自动重定向到SysWOW64目录(该目录下没有wsl.exe),需要使用Sysnative虚拟路径访问:
C:\\Windows\\Sysnative\\wsl.exe
- 64位PHP直接使用路径:
- 检查运行PHP的用户权限
如果你通过web服务(Apache/Nginx等)运行PHP,默认web服务使用系统内置账号启动,没有权限调用当前登录用户配置的WSL环境。你可以先在CLI模式下用你登录Windows的账号直接执行PHP脚本,验证命令是否正常运行;如果需要在web环境使用,将web服务的运行账号修改为你当前登录的Windows用户即可。 - 调整命令执行函数
部分环境下exec对输出的捕获存在兼容问题,可以尝试替换为shell_exec或者proc_open测试:<?php $cmd = 'C:\\Windows\\System32\\wsl.exe echo "foo"'; $out = shell_exec($cmd); var_dump($out); ?>
内容的提问来源于stack exchange,提问作者Akkua
相关产品推荐
相关产品推荐

