在 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.so
和 protobuf.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