当 运行 Symfony 命令时无法加载 PHP class

Cannot load PHP class when running Symfony command

对于以下问题,我将不胜感激。

我已经将 Symfony Messenger 设置为使用 AMQP 和 RabbitMQ。我可以在我的项目中发送消息并使用 AMQPConnection。

但是当我尝试使用消息时,我得到以下消息:

    $   php bin/console messenger:consume-messages amqp

        Attempted to load class "AMQPConnection" from the global namespace.
        Did you forget a "use" statement for "PhpAmqpLib\Connection\AMQPConnection"?

控制台命令在AmqpFactory.php

中调用了一个方法
    public function createConnection(array $credentials): \AMQPConnection
    {
        return new \AMQPConnection($credentials);
    }

所以当我从浏览器 运行 项目时,一切正常。我可以使用 AMQPConnection 和所有。但是当从终端 运行ning 时,它找不到 AMQPConnection class.

在我的 composer.json 我也安装了 amqplib

    "php-amqplib/php-amqplib": "^2.7",

我使用 Docker 并且 Docker 文件包含:

    FROM php:7-apache

    RUN usermod -u 1000 www-data &&\
        a2dissite 000-default &&\
        apt-get update &&\
        apt-get install -y \
            zlib1g-dev \
            libicu-dev \
            g++ \
            libfreetype6-dev \
            libssh-dev \
            libjpeg62-turbo-dev \
            libmcrypt-dev \
            librabbitmq-dev \
            libpng-dev &&\
        docker-php-ext-configure intl &&\
        docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ &&\
        docker-php-ext-install -j$(nproc) gd pdo_mysql intl opcache zip pcntl exif bcmath sockets &&\
        a2enmod rewrite

    RUN pecl install amqp \
        && docker-php-ext-enable amqp

    COPY docker/apache2.conf /etc/apache2/apache2.conf

    WORKDIR /var/www/project

更新! 我已经打印了 phpinfo() 并且在发送消息时我有 7.2.8 版本,在执行终端命令时我有 7.2.7。所以终端在执行命令时没有使用 PHP 的 Docker 实例。

终于解决了这个问题。我不知道我必须通过 Docker 到 运行 这个命令。这对我有用:

docker exec -ti container_name sh -c "cd /var/www/project/ && php bin/console messenger:consume-messages amqp"

您的 Docker 容器中缺少包 librabbitmq4。将 RUN apt-get update --fix-missing && apt-get update && apt-get install php-amqp 添加到您的 Docker 文件并重建映像。

使用Docker时,Symfony 命令需要在所需容器内执行。

问题来自尝试从本地主机执行 php:

$ php bin/console messenger:consume-messages amqp

而本地主机 没有 具有必要的依赖关系,在这种情况下 RabbitMQ

命令应该是 运行 使用正确的容器:

$ docker exec -ti container_name sh -c "cd /var/www/project/ && php  bin/console messenger:consume-messages amqp"

container_name 是具有 RabbitMQ 依赖项的容器的名称。