【问题标题】:Cannot load PHP class when running Symfony command运行 Symfony 命令时无法加载 PHP 类
【发布时间】:2019-01-14 04:23:09
【问题描述】:

如果我能在以下问题上获得任何帮助,我将不胜感激。

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

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

$ php bin/console messenger:consume-messages amqp 尝试从全局命名空间加载类“AMQPConnection”。 您是否忘记了“PhpAmqpLib\Connection\AMQPConnection”的“使用”语句?

控制台命令调用AmqpFactory.php内的方法

公共函数 createConnection(array $credentials): \AMQPConnection { 返回新的 \AMQPConnection($credentials); }

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

在我的 composer.json 中,我还安装了 amqplib

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

我使用 Docker,Dockerfile 包含:

来自 php:7-apache 运行 usermod -u 1000 www-data &&\ a2dissite 000-默认 &&\ apt-get 更新 &&\ apt-get 安装 -y \ zlib1g-开发\ libicu开发者\ 克++\ libfreetype6-开发\ libssh-开发\ libjpeg62-turbo-dev \ libmcrypt-开发\ librabbitmq-开发\ libpng-开发 &&\ docker-php-ext-configure 国际 &&\ 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 重写 运行 pecl 安装 amqp \ && docker-php-ext-启用 amqp 复制 docker/apache2.conf /etc/apache2/apache2.conf 工作目录 /var/www/project

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

【问题讨论】:

  • 您是否忘记了“PhpAmqpLib\Connection\AMQPConnection”的“使用”语句?
  • 错过了添加该部分。更新了上面的问题。控制台命令使用此方法:return new \AMQPConnection($credentials);。它可以创建消息,但不能使用它。区别在于消费时我使用 Symfony 控制台命令。
  • 但是你的控制台命令代码中有 use 语句吗?可以添加Command类的相关代码吗?
  • @JeroenI 添加了使用 AMQPConnection 的语句。真的很奇怪,创建消息时使用了相同的方法,效果很好。使用终端并激活命令以实际使用时,出现此错误。传递给连接的凭据也是正确的

标签: php symfony docker rabbitmq amqp


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 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 依赖项的容器的名称。

      【讨论】:

      • 谢谢!这就说得通了!欣赏它..奖励赏金和 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2020-09-27
      相关资源
      最近更新 更多