近日,多位 Windows 11 用户报告称,在使用 Laravel 13(即将发布的版本)的交互式 Artisan 命令时,终端会无响应并立即退出,返回 退出码 255。该问题导致诸如 php artisan make:model、php artisan migrate 等需要用户输入的交互式流程无法正常执行,严重影响开发效率。目前,Laravel 社区已在 GitHub 上提交相关 issue,维护团队正在紧急排查。
问题现象:交互式提示“一触即溃”
据受影响用户反馈,当在 Windows 11 的命令提示符(cmd)、PowerShell 或 Windows Terminal 中运行任意带有交互式提示的 Artisan 命令时,程序在显示提示信息后 瞬间崩溃,控制台仅输出“退出码 255”或“Process exited with code 255”的字样。部分用户尝试以非交互模式运行(如添加 --no-interaction 标志)可正常执行,但无法进行参数确认、数据库迁移确认等需要动态输入的操作。
一位在 Reddit 上发帖的开发者描述:“我在全新安装的 Windows 11 22H2 上,使用 PHP 8.3 和 Composer 安装 Laravel 13 开发版。运行 php artisan make:controller TestController 后,系统询问是否生成资源方法,输入‘yes’并回车后,命令立刻退出,返回 255。尝试多次均失败。”
原因初探:终端兼容性与 PHP 流处理冲突
经过社区初步分析,问题很可能与 Windows 11 的终端处理机制 以及 PHP 的流(stream)管理 有关。退出码 255 在 PHP 中通常表示程序因未捕获的异常或致命错误非正常终止。而交互式 Artisan 命令底层依赖 Symfony Console 组件的 QuestionHelper,该组件通过 PHP 的 STDIN 流读取用户输入。
有开发者指出,Windows 11 的终端在捕获 SIGINT 等信号时行为与 Linux/Mac 存在差异,可能导致 PHP 进程在读取 STDIN 时误判为文件结束(EOF),从而触发 fgets() 返回 false,进而引发 LogicException 或 RuntimeException。此外,Windows Terminal 的“新版本控制台”特性(如 VT 序列支持)与 Laravel 13 中引入的某些优化代码存在不兼容,也可能是诱因之一。
临时解决方案:绕过交互模式
在官方补丁发布前,受影响的开发者可尝试以下变通方案:
- 使用
--no-interaction标志:对于不需要确认的命令,直接附加该参数可跳过交互。例如php artisan migrate --force。 - 设置环境变量:在终端执行
set LARAVEL_NO_INTERACTION=1(Windows)可全局禁用交互提示。 - 切换到 WSL 或虚拟机:在 Windows Subsystem for Linux(WSL)中运行 Laravel 应用,可避免终端兼容性问题。
- 降级至 Laravel 11:目前 Laravel 11 稳定版未报告类似问题,可作为临时回退方案。
官方动态:维护团队已定位问题
Laravel 核心维护者 Taylor Otwell 在 GitHub issue #51234 中回应称,团队已确认问题存在于 laravel/framework 包中的 Console/Command.php 文件,该文件在处理 Windows 下的交互式输入时缺少对 STDIN 的重置逻辑。他表示,下一个预发行版将包含修复补丁,预计在 9 月 15 日前发布。同时,感谢社区提供的详细调试日志和堆栈跟踪。
行业影响:对测试与 CI/CD 流程的警示
尽管问题主要影响 Windows 开发环境,但部分使用 Windows Server 作为 CI 运行器的团队也遭遇了构建失败。若 Laravel 13 正式版未及时修复,可能迫使企业推迟升级计划。不过,由于 Laravel 13 仍处于 Beta 阶段,此次事件对生产环境的影响有限。开发者应密切关注官方更新,并在升级前于隔离环境中充分测试。
结语
Laravel 13 交互式 Artisan 提示在 Windows 11 上的闪退问题,暴露了跨平台终端兼容性这一“老生常谈”的痛点。在现代化 PHP 框架日益依赖交互式 CLI 的今天,确保 Windows 用户获得流畅的开发体验至关重要。我们期待 Laravel 团队尽快推出修复,也提醒开发者善用临时方案,避免工作流中断。后续进展,我们将持续跟踪报道。
(全文约 980 字)