PHP中使用grpc服务的教程详解

 更新时间:2024年03月26日 11:14:58   作者:空气力学先驱  
这篇文章主要为大家详细介绍了PHP中使用grpc服务的教程相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

grpc是通过定义服务端和客户端的代码来实现的通信的。

但是要实现通信,还是要将其方法包装为一个http请求,除非你把grpc的服务端代码放在本地的端口上。

grpc是面对微服务框架而风生水起的,上次我用python编写了一个图神经网络处理的微服务,使用grpc放在我的服务器本地端口上。

现在我希望我的一个php项目也可以调用该服务,现在来试一试吧~

流程

  • php的服务器安装protoc
  • php的服务器安装grpc
  • 编写服务端代码
  • 编写客户端代码

由于服务端(python)的代码已经编写或者说已经部署,就不做叙述了。

安装代码请根据自己的php版本和grpc版本酌情自定义。本人使用的php8.0,grpc1.62.0,protobuf4.62.0

安装protoc解释器

和windows开发一样,使用grpc服务均需要使用protoc解释器,去官方github下的release下载linux版本:

protoc-26.0-linux-x86_64.zip

解压到/usr/bin/目录下

如果你使用宝塔,你也可以直接先在本地电脑上解压,把解压后的bin文件夹里的protoc文件上传到/usr/bin/中就好了。

终端中输入protoc,有返回即为成功

安装grpc

无论你服务器是否安装pecl,可以直接通过http请求安装php相关包,但是必须安装了php(废话)

# 下载解压 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

之后要配置php的拓展

# 配置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

最后重启一下php和nginx服务就大功告成了

编译protoc文件

具体的protoc文件的定义详细见之前的博客

需要安装protoc和grpc_php_plugin

使用如下代码生成:

protoc --php_out ./ you-file.proto  #需要安装protoc解释器,生成protoc的php定义文件在当前目录(./)
protoc --grpc_out ./ you-file.proto #需要grpc_php_plugin插件安装,生成grpc文件在当前目录

第一行生成你的proto数据定义文件,我生成了GCNResult.php,Node.php,Edge.php,GraphData.php,同时还会生成一个GPBMetaData文件夹。

第二行生成php的grpc文件:GCNServiceClient.php

注意,如果你没有生成grpc文件的插件(安装grpc出现问题),可以直接下载该插件然后通过如下代码生成xxxClient.php文件

protoc --grpc_out ./ --plugin=protoc-gen-grpc=/your-path-to-plugin/grpc_php_plugin you-filename.proto

编写php请求的代码(客户端代码)

编写文件前置注意事项:

注意:如果你使用宝塔,需要把php设置里的禁用函数putenv和proc_open给删除,不然composer安装无法进行。

需要编写composer.json文件,因为使用了dirname(__FILE__).'/vendor/autoload.php'该自动导入功能。json文件内容示例:

{
    "require": {
    "grpc/grpc": "*",
    "google/protobuf": "*"
    },
    "autoload": {
        "psr-4": {
          "GPBMetadata\\": "protoc/GPBMetadata/",
          "protoc\\": "protoc/"
        }
      }
}

编写后在服务器该文件目录下启动终端输入composer install即可,会生成vendor文件夹

现在我将编写一个最简单的php文件来调用这个服务。

<?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);
}

该函数返回一个json数据,想要修改可以使用json_decode() , 至此,大功告成!

到此这篇关于PHP中使用grpc服务的教程详解的文章就介绍到这了,更多相关PHP使用grpc服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php设置编码格式的方法

    php设置编码格式的方法

    最近需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些。
    2013-03-03
  • PHP实现查询两个数组中不同元素的方法

    PHP实现查询两个数组中不同元素的方法

    这篇文章主要介绍了PHP实现查询两个数组中不同元素的方法,涉及PHP数组差集运算与数组合并的相关技巧,需要的朋友可以参考下
    2016-02-02
  • PHP缓存机制Output Control详解

    PHP缓存机制Output Control详解

    这篇文章主要介绍了PHP缓存机制Output Control,需要的朋友可以参考下
    2014-07-07
  • php获取apk包信息的方法

    php获取apk包信息的方法

    这篇文章主要介绍了php获取apk包信息的方法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • PHP用反撇号执行外部命令

    PHP用反撇号执行外部命令

    shell_exec() 命令行实际上仅是反撇号 ` 操作符的变体,如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。
    2015-04-04
  • PHP源码之explode使用说明

    PHP源码之explode使用说明

    最近一直在想有关字符串操作的一些效率上的事情,截取字串的问题,都会避免不了重新分配空间的消耗,也顺带看了explode这个函数的源码,理解下,拿出自己的分析共享下
    2011-08-08
  • 为Plesk PHP7启用Oracle OCI8扩展方法总结

    为Plesk PHP7启用Oracle OCI8扩展方法总结

    在本篇文章里小编给大家总结了关于为Plesk PHP7启用Oracle OCI8扩展方法和相关代码,需要的朋友们学习下。
    2019-03-03
  • PHP抽象类基本用法示例

    PHP抽象类基本用法示例

    这篇文章主要介绍了PHP抽象类基本用法,结合实例形式分析了php抽象类的概念、原理、定义、使用方法及相关操作注意事项,代码注释包含较为详尽的说明信息,需要的朋友可以参考下
    2018-12-12
  • php通过rmdir删除目录的简单用法

    php通过rmdir删除目录的简单用法

    这篇文章主要介绍了php通过rmdir删除目录的简单用法,实例分析了rmdir与mkdir函数的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Apache+PHP+MySQL搭建PHP开发环境图文教程

    Apache+PHP+MySQL搭建PHP开发环境图文教程

    这篇文章主要介绍了Apache+PHP+MySQL搭建PHP开发环境图文教程,文中通过图文流程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论