目录grpc是通过界说服务端和客户端的代码来实现的通信的。 但是要实现通信,照旧要将其方法包装为一个http哀求,除非你把grpc的服务端代码放在当地的端口上。 grpc是面对微服务框架而风生水起的,上次我用python编写了一个图神经网络处理的微服务,使用grpc放在我的服务器当地端口上。 如今我渴望我的一个php项目也可以调用该服务,如今来试一试吧~ 流程
由于服务端(python)的代码已经编写或者说已经部署,就不做叙述了。 安装代码请根据自己的php版本和grpc版本酌情自界说。本人使用的php8.0,grpc1.62.0,protobuf4.62.0 安装protoc表明器和windows开辟一样,使用grpc服务均需要使用protoc表明器,去官方github下的release下载linux版本: 解压到/usr/bin/目录下 假如你使用宝塔,你也可以直接先在当地电脑上解压,把解压后的bin文件夹里的protoc文件上传到/usr/bin/中就好了。 终端中输入protoc,有返回即为乐成 安装grpc无论你服务器是否安装pecl,可以直接通过http哀求安装php相关包,但是必须安装了php(废话) [code]# 下载解压 grpc cd ~ wget http://pecl.php.net/get/grpc-1.62.0.tgz tar xvf grpc-1.62.0.tgz cd grpc-1.62.0 # 生成设置并编译安装(编译安装时间很长,我大概安装了一小时左右) /www/server/php/72/bin/phpize ./configure --with-php-config=/www/server/php/72/bin/php-config make && make install [/code]之后要设置php的拓展 [code]# 设置PHP扩展 cd grpc-1.62.0 echo "extension = grpc.so" >> /www/server/php/80/etc/php.ini cd protobuf-4.62.0 # 假如没有路径请仿照grpc安装的方式手动安装安装一下,我个人以为可能并不需要 echo "extension = protobuf.so" >> /www/server/php/80/etc/php.ini [/code]最后重启一下php和nginx服务就大功告成了 编译protoc文件具体的protoc文件的界说详细见之前的博客 需要安装protoc和grpc_php_plugin 使用如下代码生成: [code]protoc --php_out ./ you-file.proto #需要安装protoc表明器,生成protoc的php界说文件在当前目录(./)protoc --grpc_out ./ you-file.proto #需要grpc_php_plugin插件安装,生成grpc文件在当前目录[/code]第一行生成你的proto数据界说文件,我生成了GCNResult.php,Node.php,Edge.php,GraphData.php,同时还会生成一个GPBMetaData文件夹。 第二行生成php的grpc文件:GCNServiceClient.php 注意,假如你没有生成grpc文件的插件(安装grpc出现问题),可以直接下载该插件然后通过如下代码生成xxxClient.php文件 [code]protoc --grpc_out ./ --plugin=protoc-gen-grpc=/your-path-to-plugin/grpc_php_plugin you-filename.proto[/code]编写php哀求的代码(客户端代码)编写文件前置注意事项: 注意:假如你使用宝塔,需要把php设置里的禁用函数putenv和proc_open给删除,否则composer安装无法举行。 需要编写composer.json文件,因为使用了dirname(__FILE__).'/vendor/autoload.php'该主动导入功能。json文件内容示例: [code]{ "require": { "grpc/grpc": "*", "google/protobuf": "*" }, "autoload": { "psr-4": { "GPBMetadata\\": "protoc/GPBMetadata/", "protoc\\": "protoc/" } } } [/code]编写后在服务器该文件目录下启动终端输入composer install即可,会生成vendor文件夹 如今我将编写一个最简单的php文件来调用这个服务。 [code]<?php require dirname(__FILE__).'/vendor/autoload.php'; // 引入 gRPC PHP 扩展的主动加载文件 require 'protoc/GraphData.php'; // 引入包罗 protoc文件夹下的grpc生成文件 require 'protoc/Node.php'; require 'protoc/Edge.php'; require 'protoc/GCNResult.php'; require 'protoc/GCNServiceClient.php'; // 举行grpc哀求,获取gcn处理后的数据,返回json字符串 function GCN_request() { $client = new GCNServiceClient('localhost:9999', [ 'credentials' => \Grpc\ChannelCredentials::createInsecure(), ]); // 创建一个实例的图数据 $G_example = new GraphData(); $G_example->setNodes([ (new Node())->setId("node1")->setFeatures([0.1, 0.2, 0.3]), (new Node())->setId("node2")->setFeatures([0.4, 0.5, 0.6]), ]); $G_example->setEdges([ (new Edge())->setSourceId("node1")->setTargetId("node2"), ]); // 发送哀求并吸收响应 list($response, $status) = $client->ProcessGraph($G_example)->wait(); if ($status->code !== Grpc\STATUS_OK) { // gRPC 哀求堕落 throw new Exception('Error calling grpc server -> ProcessGraph: ' . $status->details); exit(1); } // 因为我的返回效果是个map数据范例,php中没有该范例,需要做一个遍历取值,假如是string范例可以直接取。 $NodeScores = []; foreach ($response->getNodeScores() as $key => $value) { $NodeScores[$key] = $value; } return json_encode($NodeScores); } [/code]该函数返回一个json数据,想要修改可以使用[code]json_decode()[/code] , 至此,大功告成! 到此这篇关于PHP中使用grpc服务的教程详解的文章就先容到这了,更多相关PHP使用grpc服务内容请搜刮脚本之家从前的文章或继承欣赏下面的相关文章渴望各人以后多多支持脚本之家! 来源:https://www.jb51.net/program/318604v8v.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-2 00:53 , Processed in 0.034705 second(s), 18 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.