【问题标题】: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”命令的工作时间比以前长得多。

标签: php symfony grpc


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多