Laravel本地服务打开数页后自动停止问题求助
解决Laravel 9.52.6中
php artisan serve无提示且服务崩溃的问题 问题现象
- 执行
php artisan serve后,控制台不显示Server running on [http://127.0.0.1:8000]提示,但站点可通过该地址正常访问 - 访问少量页面后服务自动停止,需两次执行启动命令才能重启
- 服务崩溃时抛出
Undefined array key 1错误,触发点在Illuminate\Foundation\Console\ServeCommand.php的getRequestPortFromLine方法
环境配置
- Laravel版本:9.52.6
- PHP版本:8.2.4
- Composer版本:2.5.5
错误详情
ErrorException Undefined array key 1 at D:\Edu\vendor\laravel\framework\src\Illuminate\Foundation\Console\ServeCommand.php:323 319▕ protected function getRequestPortFromLine($line) 320▕ { 321▕ preg_match('/:(\d+)\s(?:(?:\w+$)|(?:\[.*))/', $line, $matches); 322▕ ➜ 323▕ return (int) $matches[1]; 324▕ } 1 D:\Edu\vendor\laravel\framework\src\Illuminate\Foundation\Console\ServeCommand.php:323 Illuminate\Foundation\Bootstrap\HandleExceptions::Illuminate\Foundation\Bootstrap\{closure}("Undefined array key 1", "D:\Edu\vendor\laravel\framework\src\Illuminate\Foundation\Console\ServeCommand.php") 2 D:\Edu\vendor\laravel\framework\src\Illuminate\Foundation\Console\ServeCommand.php:253 Illuminate\Foundation\Console\ServeCommand::getRequestPortFromLine("9500 Accepted")
问题原因
getRequestPortFromLine方法中的正则表达式/:(\d+)\s(?:(?:\w+$)|(?:\[.*))/仅能匹配带冒号的端口格式(如:8000 Accepted),但PHP内置服务器输出的日志行可能是9500 Accepted(无冒号),导致正则匹配失败,$matches数组不存在索引1,触发未定义数组键错误,进而导致服务崩溃。
解决方案
1. 临时修复源码(不推荐长期使用)
修改vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php中的getRequestPortFromLine方法,增加数组键存在性检查,并调整正则适配无冒号的端口格式:
protected function getRequestPortFromLine($line) { preg_match('/:?(\d+)\s(?:(?:\w+$)|(?:\[.*))/', $line, $matches); return isset($matches[1]) ? (int) $matches[1] : 8000; }
注意:修改vendor目录文件后,执行
composer update会覆盖修改,可使用cweagans/composer-patches工具生成持久化补丁。
2. 升级Laravel版本
该问题已在Laravel 9.x的后续补丁版本及更高主版本中修复,执行以下命令升级:
composer update laravel/framework --with-all-dependencies
3. 替换开发服务器
放弃使用php artisan serve,改用更稳定的开发服务器:
- 直接使用PHP内置服务器:
php -S 127.0.0.1:8000 -t public - 配置本地虚拟主机(如XAMPP/WAMP/Nginx)
- 使用Laravel Valet(仅Mac环境)
内容的提问来源于stack exchange,提问作者rafig khiyavi
相关产品推荐
相关产品推荐

