在 Linux 上部署 Laravel 队列(Queue),通常分为 环境准备 → 配置队列 → 启动 Worker → 后台守护 → 监控/重启 几个步骤。下面以 Redis 队列 + Supervisor 守护进程 为例(生产环境最常用)。
sudo apt update
sudo apt install redis-server
启动并设置开机自启:
sudo systemctl enable redis
sudo systemctl start redis
sudo apt install php-cli php-redis
确认:
php -m | grep redis
.envQUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
php artisan make:job SendEmail
在 app/Jobs/SendEmail.php 中写逻辑:
public function handle()
{
// 队列逻辑
}
SendEmail::dispatch($data);
php artisan queue:work
或指定队列:
php artisan queue:work redis --queue=default
⚠️ 这样关闭终端就会停止,生产环境不能用
sudo apt install supervisor
sudo vim /etc/supervisor/conf.d/laravel-worker.conf
示例配置(⚠️ 改路径):
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/your-project/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/your-project/storage/logs/worker.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
查看状态:
sudo supervisorctl status
# 监听模式(代码改动自动重启)
php artisan queue:listen
# 失败任务
php artisan queue:failed
# 重试失败任务
php artisan queue:retry all
# 清空失败任务
php artisan queue:flush
✅ 使用 queue:work 而不是 queue:listen
✅ 代码更新后必须重启 worker:
sudo supervisorctl restart laravel-worker:*
✅ 设置 --timeout 防止内存泄漏
✅ 使用 Redis / Beanstalkd,不要用 sync
.env 没改storage/logs/laravel.log如果你告诉我:
我可以给你 完全定制的一套部署方案。