在 Symfony 4.1 中使用 grpc,“找不到类 'Grpc\ChannelCredentials'。”

Posted

技术标签:

【中文标题】在 Symfony 4.1 中使用 grpc,“找不到类 \'Grpc\\ChannelCredentials\'。”【英文标题】:Using grpc in Symfony 4.1, “Class 'Grpc\ChannelCredentials' not found.”在 Symfony 4.1 中使用 grpc,“找不到类 'Grpc\ChannelCredentials'。” 【发布时间】:2019-04-29 10:06:20 【问题描述】:

在设置一切以使用 grpc 之后,根据 php "https://grpc.io/docs/quickstart/php.html" 的 grpc 文档,我尝试从使用 proto 编译器编译一些 proto 文件获得的类中构造一个客户端对象。

$rezept_nameservice_client = new Rezept_NameserviceClient('localhost:8082',
        [ 'credentials' => Grpc\ChannelCredentials::createInsecure()]);

当我尝试运行我的代码时,出现以下异常:

尝试从命名空间“App\Controller\Grpc”加载类“ChannelCredentials”。 您是否忘记了另一个命名空间的“使用”语句?

工作环境:

Ubuntu 18.04 Phpstorm Symfony 4.1 nginx 1.14.0 grpc v1.15.0 protobuf v3.6.1

我已经尝试了不同的方法来解决我在这里发现的问题:

This Problem is the closest to the problem I have

【问题讨论】:

你需要一个前导反斜杠,\Grpc\ChannelCredentials::createInsecure() 我添加了一个前导反斜杠,但问题是一样的 嗯。似乎有点不太可能。您是否已经研究过您在 Symfony 之外链接的文档中的示例?似乎有很多安装步骤要遵循,我想跳过一个很容易。我所能建议的就是在尝试在 Symfony 内部使用之前重新开始并让示例正常工作。 我在一个新的虚拟机上安装了所有干净的东西,它的工作环境与问题描述中的相同,并且由于某种原因它可以工作。我使用 c 库从源代码构建它,就像在 gprc 文档中一样,当它不起作用时,“make”命令的工作时间比以前长得多。 【参考方案1】:

解决问题的信息在错误信息中:

Attempted to load class "ChannelCredentials" from namespace "App\Controller\Grpc". Did you forget a "use" statement for another namespace?

我假设您从 App\Controller 命名空间中的特定类加载此代码。而且,它们在这个命名空间中没有命名空间Grpc

$rezept_nameservice_client = new Rezept_NameserviceClient('localhost:8082',
        [ 'credentials' => Grpc\ChannelCredentials::createInsecure()]);

首先,我认为命名空间链接命名空间中的Grcp\ChannelCredentials 类可能与using 语句错误:无法加载凭据,从而引发错误。

检查\Grpc\ChannelCredentials类的命名空间定义到使用此代码的地方。

其次,此错误消息解释了问题:无法加载此类,gRPC 是一个 php 扩展名:您必须在使用之前将extension=grpc.so 添加到您的php.ini 文件中;)

如果您在项目中使用 composer,我建议将此扩展添加到 require,如下所示:

  "require": 
    "grpc/grpc": "^1.25.*"
  

当您尝试安装您的依赖项 (composer install) 时,如果在您的 PHP 版本中找不到依赖项,您将收到一条 composer 错误消息。

【讨论】:

【参考方案2】:

Official documentation on installation for php

您需要在 php.ini 中安装 grpc.soprotobuf.so 扩展。我的问题是我安装在fpm php.ini 中,但忘记了cli php.ini,这就是我遇到问题的原因。

这个特定的类 (Grpc\ChannelCredentials) 在任何 PHP 文件中都不存在。它来自 C 扩展。要安装这些扩展,请运行:

sudo pecl install grpc
sudo pecl install protobuf

并将其添加到您的 php.ini

extension=grpc.so
extension=protobuf.so

您可以通过以下方式找到 php.ini 的位置:

php -i | grep php.ini

如果您使用的是php-fpm,请注意:

使用php -i | grep php.ini 将显示php.ini 用于命令行php 命令。为页面提供服务的“php”有自己的php.ini,通常在某个接近 cli 的地方。例如:

/etc/php/7.2/cli/php.ini
/etc/php/7.2/fpm/php.ini

【讨论】:

以上是关于在 Symfony 4.1 中使用 grpc,“找不到类 'Grpc\ChannelCredentials'。”的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Symfony 4.1 项目中安装 Doctrine Migrations V2

如何在Symfony 4.1中禁用尾部斜杠重定向?

无法在 Symfony 4.1 上安装奏鸣曲/电子商务

构建到 IOS 的颤振时找不到 BoringSSL-GRPC.modulemap

在Symfony4中测试服务:找不到类

Symfony 4 - 在 LexikJWTAuthenticationBundle 中找不到 JWT