侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤

Docker  /  管理员 发布于 1年前   350

docker环境中实现以下执行需求

1、在正式服务器中使用 docker 容器来执行 php 代码

2、需要跑关于 php 的定时任务

3、其他服务比如 nginx,mysql 在哪里执行无关紧要,既可以放入其他 docker 容器,

     也可以放入宿主机。

4、代码是放宿主机的,不在镜像内。也就是,使用数据卷的代码。

5、最好还能跑消息队列,另起一个容器。


实现方案

1、有一个镜像得包含 php

2、使用 docker-compose 编排容器。

3、同一个镜像提供一个 php-fpm 服务,且又提供一个 crond 服务,且又提供队列服务。

4、我为了省事,都用 centos 镜像打底,想轻便可以用专门的 php 官方镜像。


文件结构

/root/docker-image 文件夹

使用 tree 命令

.
|-- docker-compose.yml 自己写。
|-- logs
|   `-- php82
|       |-- fpm.slow.log 该文件是自动创建的,无视
|       `-- php.error.log 该文件是自动创建的,无视
`-- services
    `-- php82
        |-- crontab 自己写。
        |-- Dockerfile 自己写。
        |-- php-fpm.conf 自己写。官网抄,改。
        |-- myqueu.ini 自己写。官网抄,改。
        `-- php.ini 自己写。官网抄


php 的 Dockerfile

FROM centos:7.9.2009
ENV TZ Asia/Shanghai
WORKDIR /www
RUN yum -y install epel-release 
RUN yum makecache \
    && yum repolist \
    && yum install -y https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm \
    && yum makecache \
    && yum repolist \
    && yum -y install yum-utils \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
RUN yum-config-manager --enable remi-php82 \
    && yum install -y php82 php82-php-devel  php82-php-fpm  php82-php-mbstring php82-php-memcache php82-php-memcached php82-php-redis  php82-php-mysqlnd  php82-php-pdo  php82-php-bcmath php82-php-xml php82-php-gd php82-php-gmp php82-php-igbinary php82-php-imagick   php82-php-mcrypt  php82-php-pdo_mysql php82-php-posix php82-php-simplexml  php82-php-opcache php82-php-xsl php82-php-xmlwriter php82-php-xmlreader php82-php-swoole php82-php-zip php82-php-phalcon  php82-php-yaml php82-php-yar php82-php-yaf php82-php-uuid php82-php-sodium  \
    && systemctl enable php82-php-fpm \
    && yum install -y  git wget vim redis zip unzip p7zip rsync crontabs supervisor net-tools python3 \
    && groupadd www -g 1000 \
    && useradd -u 1000 -g 1000 www 
RUN ln -s /usr/bin/php82 /usr/bin/php
CMD "/usr/sbin/init"

这里说明一下 www 和 1000,需要和 宿主机的 nginx 的用户保持一致,

且 uid 和 nginx 的 uid 保持一致,比较重要。


docker-compose.yml 内容

version: "3"
services:
  php82:
    build:
      context: ./services/php82
      args:
        TZ: Asia/Shanghai
    container_name: php82
    expose:
      - 9082
    ports:
      - "9082:9082"
    volumes:
      - /www/wwwroot:/www/wwwroot:rw
      - ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
      - ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
      - ./logs/php82:/var/log/php
    restart: always
    cap_add:
      - ALL
    command: ["/opt/remi/php82/root/usr/sbin/php-fpm", "--nodaemonize",  "--allow-to-run-as-root" ]
    networks:
      - default
  mycrond:
    build:
      context: ./services/php82
      args:
        TZ: Asia/Shanghai
    container_name: mycrond
    volumes:
      - /www/wwwroot:/www/wwwroot:rw
      - ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
      - ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
      - ./logs/php82:/var/log/php
      - ./services/php82/crontab:/etc/crontab:rw
    restart: always
    command: ["/usr/sbin/crond", "-n" ]
    networks:
      - default
  myqueue:
    build:
      context: ./services/php82
      args:
        TZ: Asia/Shanghai
    container_name: myqueue
    volumes:
      - /www/wwwroot:/www/wwwroot:rw
      - ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
      - ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
      - ./logs/php82:/var/log/php
      - ./services/php82/myqueue.ini:/etc/supervisord.d/myqueue.ini:rw
    restart: always
    command: ["/usr/bin/supervisord", "-n" ]
    networks:
      - default
networks:
  default:
    driver: bridge
    ipam:
      driver: default

说明,mycrond 容器多了一个 crond 文件映射。

这样,就只有 mycrond 容器才可能有定时任务,其他容器一定没有,可靠又方便。

另外,只有 myqueue 容器有消息队列的配置,其余容器都没有。也非常安全。


crontab 内容

这其实是容器在执行的。不是宿主机执行。

注意 user www

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * www  cd /www/wwwroot/laravel项目文件夹 && php82 artisan schedule:run >> /dev/null 2>&1


myqueue.ini

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php82 /www/wwwroot/my_project_folder/artisan queue:work --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www
numprocs=1  ## 这是只跑一个队列的意思。可以设多个,比如 8,那样就并发 
redirect_stderr=true
stdout_logfile=/etc/supervisord.d/worker.log
stopwaitsecs=3600

注意上面的 user www。


当队列处理代码修改后,需要容器内执行重启队列命令:

supervisorctl restart all

因为这是守护进程,修改代码不影响正在执行的进程。

所以我们修改代码后,需要重启让代码生效。


总结

docker-compose 的启动命令 :

进入 docker-image 目录,docker-compose up -d

本文的内容是实际检测通过的,定时任务确实跑起来了。

myqueue 是消息队列,也跑起来了。

用 docker 可以在服务器,主要是多 php 版本的情况会用到。

以及通过 yum 安装失败,文件混乱的时候会用到。



  • 上一条:
    Laravel 10.47版本发布 - 新增查询生成器whereAll()、whereAny()方法
    下一条:
    在Laravel和Livewire中集成Cloudflare Turnstile
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤(0个评论)
    • 在MacBook下laravel项目多php版本docker开发环境配置方案(0个评论)
    • 在docker环境中部署docker部署elk架构流程步骤(1个评论)
    • docker compose跟Dockerfile的区别浅析(0个评论)
    • Ubuntu 22.04系统中安装podman流程步骤(1个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2020-06
    • 2021-05
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-11
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客