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

时间:2018-11-27 15:59:22

标签: php symfony grpc

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

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

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

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

工作环境:

  • 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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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的{​​{1}}。服务页面的“ php”通常在接近CLI的某个地方拥有自己的php。例如:

php.ini

答案 1 :(得分:0)

解决此问题的信息位于错误消息中:

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版本中未找到依赖项,则会显示一条错误消息。