根据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?
工作环境:
我已经尝试了其他方法来解决在这里发现的问题:
This Problem is the closest to the problem I have
有什么建议吗?
答案 0 :(得分:0)
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
的{{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版本中未找到依赖项,则会显示一条错误消息。