答案是:先确认.env文件存在且含有效app_key(base64:开头的32位字符串),若缺失则运行php artisan key:generate生成;若已存在但报错,需依次执行php artisan config:clear和php artisan config:cache刷新配置缓存。

直接用 php artisan serve 就能启动,但必须先确保 .env 文件存在且密钥已生成,否则会报 RuntimeException No application encryption key has been specified。
为什么 php artisan serve 会报密钥错误
因为 Laravel 6 默认要求 .env 中存在 APP_KEY 才能启动内置服务器。新项目初始化后,.env 是从 .env.example 复制来的,但 APP_KEY 是空的。
- 不运行
php artisan key:generate就执行php artisan serve,必然失败 - 即使你手动填了随机字符串,也必须是 32 字符、base64 编码格式(
php artisan key:generate会自动处理) - 该命令还会把密钥写入
.env,并确保bootstrap/cache/config.php被刷新(Laravel 6 的配置缓存机制依赖它)
启动前必须检查的三件事
缺一不可,顺序不能乱:
-
.env文件是否存在?不存在就先cp .env.example .env -
APP_KEY是否为空?用grep APP_KEY .env看一眼,为空就立刻php artisan key:generate - 当前目录是否为 Laravel 项目根目录?即包含
artisan、composer.json和public/的那层;进错目录会导致找不到命令或路由异常
端口被占或想换地址怎么办
php artisan serve 默认绑定 127.0.0.1:8000,但 macOS 上常有其他服务(如 Python 的 http.server、旧 Valet 进程)占着 8000 或 8080。
- 换端口:
php artisan serve --port=8081 - 换 host(比如让局域网设备访问):
php artisan serve --host=0.0.0.0 --port=8000,但注意 macOS 可能弹窗提示“是否允许此应用接收网络连接”,要点允许 - 如果提示
Address already in use,用lsof -i :8000查进程,再kill -9 PID
Valet / Herd 用户别混淆本地服务器用途
如果你已装 Valet 或 Herd,php artisan serve 仍可运行,但它和 Valet/Herd 是两套独立机制:
-
php artisan serve启动的是 PHP 内置服务器,只适合临时调试、CI 流水线或无 Nginx 场景 - Valet/Herd 是完整 Web 栈(Nginx + PHP-FPM + DNS),支持 HTTPS、多域名、邮件预览等,日常开发应优先用它们
- 两者同时运行不冲突,但别误以为
php artisan serve能替代 Valet 的valet link或 Herd 的自动*.test解析
真正容易被忽略的是:Laravel 6 的 serve 命令在底层调用的是 PHP 的 -S 参数,它不解析 .htaccess、不支持重写规则(如 Laravel 的 URL 重写),所以所有请求必须经由 public/index.php 入口 —— 这也是为什么你不能在 public/ 目录里直接运行它,必须从项目根目录执行。











