运行 Symfony 命令时无法加载 PHP 类

Posted

技术标签:

【中文标题】运行 Symfony 命令时无法加载 PHP 类【英文标题】:Cannot load PHP class when running Symfony command 【发布时间】: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 的语句。真的很奇怪,创建消息时使用了相同的方法,效果很好。使用终端并激活命令以实际使用时,出现此错误。传递给连接的凭据也是正确的 【参考方案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

以上是关于运行 Symfony 命令时无法加载 PHP 类的主要内容,如果未能解决你的问题,请参考以下文章

我无法发出任何工匠命令...每当我运行命令时,它都会说无法加载 php mbstring.so 5.6

symfony 不能在 Windows Server 2008 上运行

运行命令doctrine:schema:update symfony时出错

VPS:切换PHP版但仍无法安装symfony4

symfony2 cygwin cli php命令错误

无法读取Dotenv.php中的“../.dev.env”环境文件:symfony