php使用grpc(windows环境下)

php使用grpc(windows环境下),第1张

概述所谓RPC(remoteprocedurecall远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样比如:服务器端实现一个服务(Go语言实现),客户端用php调用,最终效果象调用本地方 @H_404_0@所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/clIEnt模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样

比如:服务器端实现一个服务(Go语言实现),客户端用PHP调用,最终效果象调用本地方法一样使用。

一、下载Protoc
下载地址:https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protoc-3.7.1-win64.zip,此软件是用于把proto文件生成PHP端的代码
*** 作步骤:
1.解压
2.把protoc-3.7.1的文件夹放到c盘下的 program files文件夹下面
3.右击 "计算机",属性->高级->环境变量,在系统变量的path中追加protoc的bin目录

@H_404_0@4.查看是否成功

@H_404_0@ 

@H_404_0@二、使用protoc安装 proto文件生成PHP代码
1.把生成的proto文件放在当前项目的目录下,如下图的1标记所示:



2.用protoc命令生成proto文件为PHP代码
protoc --PHP_out=. public.proto
protoc --PHP_out=. dydb_guIDe.proto

@H_404_0@


通过以上命令生成上图所示的2对应的目录

public.proto的文件内容如下所示:
 

Syntax = "proto3";package public;option go_package = ".;dydbpb";enum DBType {    mongodb = 0;     MysqL = 1;    postgresql = 2;} // 暂时只支持mongodbmessage Project {    string project_ID = 2; // 必须,项目ID,可对应合同    string project_type = 1; // 可选,项目类型,按类型设置namespace,不设置时默认为公共空间public    DBType database_type = 3; // 可选,首次创建不指定时默认为mongodb,或根据database_ID匹配    string database_ID = 4;// 可选, 数据库ID,不指定时默认为"project_type-project_ID",多个数据库时可指定    string capacity =5;// 可选, 数据库初始容量    string copy_database=6; // 可选,默认为空忽略,设置为已有数据库的database_ID则拷贝已有数据库磁盘建立新库}message Database {    // Project project=1;    string name = 1;    string namespace=2;    string database_ID =3;    string type = 4;    string version =5;    string user =6;    string password = 7;    string url = 8;    bool new_disk = 9;    string pvc_ID = 10;    string capacity =11;}// 是否成功message Success {    bool ok = 1;    string reason = 2;}
@H_404_0@dydb_guIDe文件内容
 

Syntax = "proto3";package dydbguIDe;option go_package = ".;dydbpb";import "public.proto";service DydbGuIDe {    // GetDB 启动数据库服务并返回数据库地址    rpc GetDB(public.Project) returns (public.Database) {}    // NewDB 放弃原数据库磁盘,创建新磁盘(下次启动生效)    rpc NewDB(public.Project) returns (public.Success) {}    // KeepAlive 保持开启,用于有对应流程在运行    rpc KeepAlive(public.Project) returns (public.Success) {}    // DBStatu 查询数据库当前状态    rpc GetDBStatu(public.Project) returns (Status) {}    // DBInfo 查询数据库当前统计,如空间大小, 类型, 密码,已使用空间大小,记录数,最大资源使用,启动次数,启动总时长,最近启动时间,最近关闭时间,最近访问时间,请求次数(总/最近),磁盘列表等    rpc GetDBInfo(public.Project) returns (Info) {}}// 流程状态信息message Status {    enum Statu {        // 准备中        pending = 0;         // 运行中        running = 1;        // 失败出错        Failed = 2;        // 关闭冻结        closed = 3;    }    Statu statu = 1;    public.Database database = 2;    bytes message = 3;}// 信息message Info {    public.Database database = 1;    string create_time = 2;    string latest_start_time = 3;    string latest_close_time = 4;    string latest_visit_time = 5;    int32 sum_work_time = 6;    int32 sum_start_num =7;    int32 sum_visit_num = 8;    string capacity = 9;     string used_size = 10;}
@H_404_0@ 

@H_404_0@二、使用composer安装PHP组件
1.在composer.Json中追加如下信息,require信息标识要用的新组件,autoload标识要加入命名空间

{  "require": {    "Google/protobuf": "^3.17",    "grpc/grpc": "^1.38"  },  "autoload":{    "psr-4":{      "GPBMetadata\":"GPBMetadata/",      "PBPublic\":"PBPublic/",      "DydbguIDe\":"DydbguIDe/"    }  }}
@H_404_0@2.执行composer update命令
通过update方法后,就可以通过命名空间直接调用到DydbguIDe和PBPublic对应的代码
 

@H_404_0@ 

@H_404_0@三、在已生成的代码目录下添加入口文件
1.在DydbguIDe文件夹下增加DydbguIDeClIEnt.PHP

<?PHPnamespace DydbguIDe;/** * service DydbguIDe{} * 编写 (gprc 定义 DydbguIDe 服务)的客户端 */class DydbguIDeClIEnt extends \Grpc\BaseStub{    public function __construct($hostname, $opt_params = null, $channel = null)     {        try {            $opts = [                'credentials' => \Grpc\ChannelCredentials::createInsecure(),                'timeout' => 1,            ];            if (!empty($opt_params)) {                $opts = array_merge($opts, $opt_params);            }                        parent::__construct($hostname, $opts, $channel);        } catch (\Exception $e) {            throw new \Exception($e->getMessage());        }    }    /**     * 获取数据库,如果不存在则创建新的数据库     *     *     **/    public function getDB($params)    {        try {            $verify = new \Custom\Org\Verify;            $verify->required($params, ['project_sn']);            $request = new \PBPublic\Project();            $request->setProjectID($params['project_sn']);            if (isset($params['project_type'])) {                $request->setProjectType($params['project_type']);            }            $result = $this->_getDB($request)->wait();            List($obj, $reply) = $result;            $response = [];            if ($reply->code == 0) {                $response['name']      = $obj->getname();                $response['namespace'] = $obj->getnamespace();                $response['db_ID']     = $obj->getDatabaseID();                $response['type']      = $obj->getType();                $response['version']   = $obj->getVersion();                $response['user']      = $obj->getUser();                $response['password']  = $obj->getpassword();                $response['url']       = $obj->getUrl();                $response['new_disk']  = $obj->getNewdisk();                $response['pcv_ID']    = $obj->getPvcID();                $response['capacity']  = $obj->getCapacity();            }            return $response;        } catch (\Exception $e) {            throw new \Exception ($e->getMessage());        }    }    /**     * 获取数据库,如果不存在则创建新的数据库     *     * 该方法的参数是按照proto的文件来编写的     **/    private function _getDB(\PBPublic\Project $argument, $Metadata=[], $options=[]){        try {                } catch (\Exception $e) {            throw new \Exception($e->getMessage());        }        return $this->_simpleRequest('/dydbguIDe.DydbGuIDe/GetDB', $argument,['\PBPublic\Database', 'decode'], $Metadata, $options);    }    /**     * 已有的项目创建新的数据库(当前用不上)     *     *     **/    public function newDB(\PBPublic\Project $params){               $result = $this->_newDB($params)->wait();        List($obj, $reply) = $result;        if ($reply->code == 0) {                    }    }    /**     * 已有的项目创建新的数据库(当前用不上)     *     *该方法的参数是按照proto的文件来编写的     **/    private function _newDB(\PBPublic\Project $argument, $Metadata=[], $options=[]){        return $this->_simpleRequest('/dydbguIDe.DydbGuIDe/NewDB', $argument,['\PBPublic\Success', 'decode'], $Metadata, $options);    }}
@H_404_0@四、测试PHP端代码
 

public function test()    {        set_time_limit(0);        $ip = 'ip地址:端口号';        $API = new \DydbguIDe\DydbguIDeClIEnt($ip);        $result = $API->getDb(['project_sn' => 'zytest0524', 'project_type' => 'ygdd']);        print($result);            }
@H_404_0@结果为:
 

Array(    [name] => dydb-zytest0524    [namespace] => dydb-ygdd    [db_ID] => zytest0524    [type] => mongodb    [version] =>     [user] => admin    [password] => BNPA0TPM    [url] => 10.11.0.210:27017    [new_disk] =>     [pcv_ID] => dydb-zytest0524-pvc-1621912935241594000    [capacity] => 10Gi)
@H_404_0@ 

@H_404_0@ 

@H_404_0@参考链接:https://blog.csdn.net/uisoul/article/details/90483050

 
总结

以上是内存溢出为你收集整理的php使用grpc(windows环境下)全部内容,希望文章能够帮你解决php使用grpc(windows环境下)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1001324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存