在laravel中实现分布式horizon

AI摘要
本文分享了Laravel Horizon的本地与服务器部署调试方案。本地开发使用多终端分别运行服务、计划任务和Horizon面板;服务器部署采用dnmp方案,通过Docker Compose配置Redis、Nginx、PHP及Horizon服务,支持多服务器分布式任务处理,并强调Redis配置一致性。

关于horizon的基本操作这里不赘述,虽然有点复杂,但总体上看文档还是能跑起来的(https://learnku.com/docs/laravel/11.x/horizonmd/16721#configuration)

这里简单说一下我的本地开发调试的方式,在vs中打开多个终端,一个终端运行php artisan serve,负责debug,一个终端运行php artisan schedule:work,负责启动计划任务,一个终端运行php artisan horizon,来运行监控面板。

放到服务器部署的话,我用的是dnmp方案,提供php+nginx或者php+caddy来运行站点。

另外在laravel项目中创建了一个docker-compose.yml:

services:

redis:
image: redis:7-alpine
container_name: laravel_redis
profiles: [independence]
restart: unless-stopped
volumes:
- ./docker/data/redis:/data
networks:
- laravel-network
healthcheck:
test: [“CMD”, “redis-cli”, “ping”]
interval: 10s
timeout: 5s
retries: 5

nginx:
image: nginx:alpine
container_name: laravel_nginx
profiles: [independence]
restart: unless-stopped
ports:
- “${HORIZON_PORT:-8000}:80”
volumes:
- .:/var/www
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
networks:
- laravel-network
depends_on:
- php

php:
image: registry.cn-beijing.aliyuncs.com/futuremeng/php:8.4.11-fpm
container_name: laravel_php
profiles: [independence]
working_dir: /var/www
volumes:
- .:/var/www
networks:
- laravel-network
environment:
- APP_ENV=production
- QUEUE_CONNECTION=redis

laravel_horizon:
image: registry.cn-beijing.aliyuncs.com/futuremeng/php:8.4.11-fpm

# build:
#   context: .
#   dockerfile: Dockerfile
container_name: laravel_horizon
working_dir: /var/www  # 设置工作目录
command: php artisan horizon
restart: unless-stopped
volumes:
  - .:/var/www
environment:
  - APP_ENV=production
  - QUEUE_CONNECTION=redis
networks:
  - laravel-network

laravel_scheduler:
image: registry.cn-beijing.aliyuncs.com/futuremeng/php:8.4.11-fpm

# build:
#   context: .
#   dockerfile: Dockerfile
container_name: laravel_scheduler
working_dir: /var/www  # 设置工作目录
command: php artisan schedule:work
restart: unless-stopped
volumes:
  - .:/var/www
environment:
  - APP_ENV=production
depends_on:
  - laravel_horizon
networks:
  - laravel-network

networks:
laravel-network:
driver: bridge

# name: laravel-network
ipam:
  driver: default
  # 解除下面的注释可以设置网段,用于nginx等容器固定容器IP
  config:
   - subnet: 10.10.0.0/24

在服务器1上用正常方式启动nginx+php+mysql+redis,在服务器2上用这个来运行队列任务,当执行:

docker compose up -d
时,.env中的mysql和redis都链接到服务器1的实例,然后在服务器1的IP:PORT/horizon中就可以看到了任务执行情况了,这个时候假定的是服务器1不执行job,而服务器2只负责执行job,当然,也可以合并到服务器1来运行,也可以启动服务器3来按服务器2一样的配置来运行。这里的关键点就是redis的配置要完全一样,比如使用同一个DB。

另外一种方式是:

docker compose –profile independence up -d
这时候在服务器2上会启动额外的redis,而服务器2的laravel中配置为连接服务器1的mysql来拉取任务,而队列管理放在服务器2自己的redis上。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!