Laravel 13 的交互式 Artisan 提示在 Windows 11 上会立即退出(退出码 255)
问题
我在 Windows 11 上使用 Laravel 13 时遇到了一个奇怪的问题。
任何需要交互输入的 Artisan 命令在我还没输入任何内容时就会立即退出。
例如:
php artisan migrate
输出:
WARN The database 'fito-db' does not exist on the 'mysql' connection.
Would you like to create it? (yes/no) [yes]
❯
此时,进程会立即退出,PowerShell 返回到提示符。
运行:
echo $LASTEXITCODE
返回:
255
没有 异常、堆栈跟踪,以及 错误信息。
环境
- Windows 11
- PHP 8.4.15 (CLI)
- Laravel Framework 13.8
- Symfony Console (随 Laravel 13 一起提供)
- PowerShell
- Windows Terminal
同样的行为也出现在:
- Windows PowerShell
- PowerShell 7
- CMD
- Windows Terminal
我已验证的事项
STDIN 能正确工作
php -r "echo 'type: '; var_dump(fgets(STDIN));"
输出:
type:
hello
string(6) "hello
"
STDIN 是交互式的
php -r "var_dump(stream_isatty(STDIN));"
输出:
bool(true)
Xdebug 不是原因
使用以下方式运行:
php -d xdebug.mode=off artisan migrate
产生的行为与之前完全相同。
Tinker 正常工作
php artisan tinker
我可以正常输入命令:
> print("hello")
hello
因此,交互输入本身是可以工作的。
非交互模式可用
php artisan migrate --no-interaction
命令会正常继续执行(只是因为数据库不存在而失败,这是预期之事)。
额外观察
这个问题只出现在 新的 Laravel 项目(Laravel 13) 上。
同一台机器上的较旧 Laravel 项目(Laravel 10/11)并没有这个问题。
因为 Tinker 可以工作且 STDIN 互动,我不认为这是一个通用的 PHP STDIN 问题。
似乎只有在 Laravel 遇到其中一个交互式确认提示时才会发生(例如 confirm())。
我调查过的内容
从阅读 Laravel 的源代码来看,交互式提示现在通过 laravel/prompts,最终进入 Symfony Console。
我在想这是否与以下方面相关:
- Laravel Prompts
- Symfony Console
- Windows ConPTY / 终端处理
- 在 Windows 上的 PHP 8.4
- 已知的 Laravel 13 回归
WSL
一个可能相关也可能无关的细节:
WSL 在我的机器上似乎有问题。
如果我从 Windows 资源管理器的上下文菜单中选择 "在此处打开 Linux Shell",终端会打开并立即关闭。
我不确定这是否相关,因为我是在 Windows 原生运行 PHP,而不是在 WSL 内。
问题
是否有人在 Windows 上使用 Laravel 13 时遇到过这个问题?
是否存在与 Laravel Prompts 或 Symfony Console 相关的已知问题,会在退出码为 255 时使交互式 Artisan 命令立即退出,同时:
STDIN正常工作,stream_isatty(STDIN)返回true,php artisan tinker正常工作,- 只有交互式确认提示失败?
如果有指向相关 GitHub 问题或已知的 Windows 专用错误的线索,将不胜感激
答案 1
语法错误、不存在的类、命名空间拼写错误。你能检查 .env 配置以验证数据库访问吗? Tinker 不使用数据库连接,因此运行它没有问题。 使用以下命令查看堆栈跟踪:
php artisan migrate -vvv
你可以将整个输出日志保存到一个文件:
php artisan migrate 2>&1 | tee error.log
获得 error.log 之后,能否分享消息日志?
作者:提问:AmirHossein Najjarbshi;回答:Mince net;许可协议:CC BY-SA 4.0