docker - 如何在 docker 上的 php-fpm 图像中运行 laravel 作业 queue

我有一个带有 nginx、mailhog、redis 和 PHP 映像的容器。所有这些图像都在同一个网络上。我在 PHP 图像上运行 Laravel。我想利用 laravel 的 Job queue ,但我很难在 PHP 图像中运行 queue 。我查看了所有示例,但似乎我对 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 和 queue 非常简单,但我不知道如何启动 queue。 php artisan queue:work in the php image returs “queue:”命名空间中没有定义命令。你是这个意思吗? queue

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

回答1

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

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

php artisan tinker

从 tinker 在特定的 queue 上调度作业

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

第一个参数 - Queue 名称

第二个参数 - 作业名称

一次将多个作业分派到特定的 queue

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

相似文章