如何用单命令启动Laravel本地开发服务器?WSL环境问题求助
简化WSL下Laravel项目启动步骤的方案
针对你需要执行多个命令才能启动项目的问题,下面提供几个实用的单命令启动方案,同时解决你用supervisor无法访问localhost:8000的可能问题:
方案一:编写Shell脚本(最快捷)
在项目根目录创建一个start.sh脚本,把所有启动命令后台运行并输出日志:
#!/bin/bash # 确保日志目录存在 mkdir -p storage/logs # 启动Laravel内置服务器 php artisan serve > storage/logs/serve.log 2>&1 & echo "Laravel serve 已启动 (PID: $!)" # 启动WebSockets服务 php artisan websockets:serve > storage/logs/websockets.log 2>&1 & echo "WebSockets服务已启动 (PID: $!)" # 启动队列监听 php artisan queue:listen > storage/logs/queue.log 2>&1 & echo "队列监听已启动 (PID: $!)" # 启动Angular开发服务器 ng s -o > storage/logs/angular.log 2>&1 & echo "Angular服务已启动 (PID: $!)" echo "所有服务启动完成!"
使用步骤:
- 给脚本添加执行权限:
chmod +x start.sh - 启动所有服务:
./start.sh
停止服务:
如果需要停止所有相关进程,可以执行:
pkill -f "php artisan" pkill ng
方案二:自定义Laravel Artisan命令(更贴合Laravel生态)
通过自定义Artisan命令,用PHP代码统一管理启动流程:
- 生成自定义命令:
php artisan make:command StartAllServices
- 编辑生成的
app/Console/Commands/StartAllServices.php文件:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Symfony\Component\Process\Process; class StartAllServices extends Command { protected $signature = 'start:all'; protected $description = '一键启动Laravel服务、WebSockets、队列监听和Angular开发服务器'; public function handle() { $this->info('正在启动Laravel开发服务器...'); Process::fromShellCommandline('php artisan serve > storage/logs/serve.log 2>&1 &')->run(); $this->info('Laravel服务器启动完成'); $this->info('正在启动WebSockets服务...'); Process::fromShellCommandline('php artisan websockets:serve > storage/logs/websockets.log 2>&1 &')->run(); $this->info('WebSockets服务启动完成'); $this->info('正在启动队列监听...'); Process::fromShellCommandline('php artisan queue:listen > storage/logs/queue.log 2>&1 &')->run(); $this->info('队列监听启动完成'); $this->info('正在启动Angular开发服务器...'); Process::fromShellCommandline('ng s -o > storage/logs/angular.log 2>&1 &')->run(); $this->info('Angular服务器启动完成'); $this->info('所有服务已正常运行!'); } }
- 启动服务:
php artisan start:all
关于Supervisor无法访问localhost:8000的排查
如果坚持用Supervisor,检查以下几点:
- 配置文件路径:确保command和directory用的是WSL内的绝对路径(比如
/home/your-user/project,不是Windows的C:/xxx) - 端口占用:在WSL内执行
netstat -tulpn | grep 8000,确认端口被php artisan serve占用,且没有Windows程序占用该端口 - WSL端口转发:WSL2默认自动转发端口,但偶尔会失效,可重启WSL(
wsl --shutdown后重新打开)或检查Windows防火墙是否拦截了8000端口 - 测试访问:先在WSL内执行
curl localhost:8000,如果能正常返回页面,说明服务没问题,再在Windows浏览器访问;如果WSL内都访问不了,检查Supervisor的日志文件(配置里的stdout_logfile)看启动报错
示例Supervisor配置(放在/etc/supervisor/conf.d/laravel-project.conf):
[program:laravel-serve] command=/usr/bin/php /home/your-user/project/artisan serve directory=/home/your-user/project autostart=true autorestart=true user=your-wsl-username stdout_logfile=/home/your-user/project/storage/logs/serve.log stderr_logfile=/home/your-user/project/storage/logs/serve-error.log [program:laravel-websockets] command=/usr/bin/php /home/your-user/project/artisan websockets:serve directory=/home/your-user/project autostart=true autorestart=true user=your-wsl-username stdout_logfile=/home/your-user/project/storage/logs/websockets.log stderr_logfile=/home/your-user/project/storage/logs/websockets-error.log [program:laravel-queue] command=/usr/bin/php /home/your-user/project/artisan queue:listen directory=/home/your-user/project autostart=true autorestart=true user=your-wsl-username stdout_logfile=/home/your-user/project/storage/logs/queue.log stderr_logfile=/home/your-user/project/storage/logs/queue-error.log [program:angular-serve] command=/usr/bin/npm run start -- -o directory=/home/your-user/angular-project autostart=true autorestart=true user=your-wsl-username stdout_logfile=/home/your-user/angular-project/logs/angular.log stderr_logfile=/home/your-user/angular-project/logs/angular-error.log
配置后执行以下命令生效:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start all
内容的提问来源于stack exchange,提问作者Jheems
相关产品推荐
相关产品推荐

