【问题标题】:How to run laravel job queue in php-fpm image on docker如何在 docker 上的 php-fpm 映像中运行 laravel 作业队列
【发布时间】:2022-06-22 02:55:36
【问题描述】:

我有一个包含 nginx、mailhog、redis 和 PHP 映像的容器。所有这些图像都在同一个网络上。 我在 PHP 图像上运行 Laravel。 我想利用 laravel 拥有的作业队列,但我正在努力在 PHP 图像中运行队列。 我查看了所有示例,但似乎我对 docker 缺乏了解导致我没有提出正确的问题

下面是我的 docker-compose.yml

version: '3'

networks:   
    devnet:
        external: true
    
services: 

    # lightweight web-server:
    nginx: 
        image: nginx:stable-alpine
        container_name: lar-nginx
        ports:
            - 8080:80
            - 4040:443
        volumes: 
            - ./:/var/www
            - ./run/nginx:/etc/nginx/conf.d
            - ./local/certs:/etc/nginx/certs
        depends_on:
            - php
        networks:
            - devnet
    
    # server-side scripting engine
    php:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: lar-php
        volumes:
            - ./:/var/www
        ports:
            - "9000:9000"
        networks:
            - devnet

    # caching server:
    redis:
        image: redis:latest
        container_name: lar-redis
        ports:
            - "6379:6379"
        networks:
            - devnet        
    
    # development email catch-all server & client:
    mailhog:
        image: mailhog/mailhog:latest
        container_name: lar-mailhog
        ports:
            # imap port for send mail
            - "1025:1025"
            # www mailhog ui
            - "8025:8025"
        networks:
            - devnet            

Dockerfile


FROM php:7.4-fpm

RUN apt-get update
RUN apt-get -y install curl gnupg cron
# RUN curl -sL https://deb.nodesource.com/setup_12.x  | bash -
# RUN apt-get -y install nodejs
# RUN npm install

# Install other required PHP extensions and unix utils:
RUN apt-get update && apt-get install -y libmcrypt-dev \
    mariadb-client libmagickwand-dev libonig-dev \
    libzip-dev libcurl4-openssl-dev redis-server \ 
    zlib1g-dev wget git \
    --no-install-recommends \
    # && pecl install imagick 
    # && docker-php-ext-enable imagick 
    && docker-php-ext-install pdo_mysql \ 
    && docker-php-ext-install mbstring \
    && docker-php-ext-install zip \
    && docker-php-ext-install xml \
    && docker-php-ext-install curl \
    && docker-php-ext-install gd \
&& docker-php-ext-install soap

# Configure PHP internal vars:
ENV PHP_MEMORY_LIMIT=256M

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install php apcu pecl package:
RUN pecl install apcu && docker-php-ext-enable apcu

# Install php redis pecl package:
RUN pecl install redis && docker-php-ext-enable redis
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl

# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www

COPY entrypoint.bash /usr/sbin
RUN chmod a+x /usr/sbin/entrypoint.bash
ENTRYPOINT /usr/sbin/entrypoint.bash

入口点.bash

#!/bin/bash
# turn on bash's job control
set -m
# Start the "main" PHP process and put it in the background
php-fpm &
# Start the helper crond process
crond
# now we bring the primary process back into the foreground
fg %1

在普通服务器(灯)环境中,使用 cronjobs 和队列非常简单,但我不知道如何启动队列。 php artisan queue:work 在 php 图像返回“队列:”命名空间中没有定义命令。你是这个意思吗?排队

在修补程序中运行它 \Queue::pushON('new', new App\Jobs\PublishingClass(array('foo'=>1,'foobar'=>783,'foobarfoo'=>33))); 显示作业已处理,但我需要使用在后台运行的进程来完成

【问题讨论】:

    标签: laravel docker process queue laravel-5.7


    【解决方案1】:

    最简单的方法是使用 Tinker 调用

    这是用于调试的 Laravel 命令,通过从项目根目录运行以下命令来使用它

    php artisan tinker
    

    通过 tinker 在特定队列上调度作业

    \Queue::pushON('rms', new App\Jobs\UpdateRMS());

    第一个参数 - 队列名称

    第二个参数 - 作业名称

    一次将多个作业分派到特定队列

    \Queue::bulk([new App\Jobs\UpdateRMS(), new App\Jobs\UpdateRMS()], null, 'rms');
    

    【讨论】:

    • 我不想使用修补程序。这不是我们生活环境的反映
    • 啊……我误解了你的问题……我记得在生产中我使用了一个主管来排队,你试过这个吗?看看这个帖子:stackoverflow.com/a/44501632/13678053
    • 我也想最好远离安装主管。我希望它尽可能精简,没有任何依赖
    • 不幸的是,我不能提出更好的选择......不要害怕使用主管,我知道这是一个额外的依赖,但我看不出有什么问题在我看来,这符合最佳实践。
    【解决方案2】:

    你可以使用这个docker镜像,你不需要配置调度,它已经实现了,有不同的php扩展,比如redis,Rdkafka。 按照这个链接: https://hub.docker.com/r/jkaninda/laravel-php-fpm

    https://github.com/jkaninda/laravel-php-fpm

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2017-11-20
      • 2017-12-02
      • 2019-11-09
      • 2016-09-01
      相关资源
      最近更新 更多