教程下载地址: 网赚博客http://www.piaodoo.com/创业项目排行榜前十名http://www.piaodoo.com/
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版本:
解压到/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数据,想要修改教程下载地址: 网赚博客http://www.piaodoo.com/创业项目排行榜前十名http://www.piaodoo.com/
一、前言
有些CMS在部署的时候不用使用数据库工具,而是通过数据库安装页面就能完成数据库创建和数据填充,所以自己就想动手做一个这样的功能,这样在给别人安装系统的时候就不用再那么麻烦了,直接一键安装解决了。
二、效果图
输入数据库相关信息后,点击安装并有不同的提示。
三、核心代码
原理:其实就是通过构建原生SQL来创建并初始化数据库,连接数据库、创建数据库、使用数据库、创建数据表、新增数据、关闭连接。
创建前首先要准备以下内容:
① 准备数据库的基本信息:数据库地址、数据库名称、用户名、密码
② 要创建的表及表结构
③ 要初始化的数据
public function createDb($data)
{
$host = $data['mysqlHostname'];
$user = $data['mysqlUsername'];
$pwd = $data['mysqlPassword'];
$db = $data['mysqlDatabase'];
// 1.连接数据库
$conn = mysqli_connect($host, $user, $pwd);
if (!$conn) {
// echo "1/7 数据库连接失败<br/><br/>";
return '1/7 数据库连接失败';
}else{
// echo "1/7 数据库连接完成<br/><br/>";
}
// 2.创建数据库
// 先删除再创建
$sql = "DROP DATABASE {$db}";
if (mysqli_query($conn, $sql)) {
// echo "2/7 数据库删除完成<br/>";
}else{
// echo "2/7". mysqli_error($conn)."<br/><br/>";
// return "2/7 ".mysqli_error($conn);
}
// 创建
$sql = "create database {$db}";
if (mysqli_query($conn, $sql)) {
// echo "2/7 数据库创建完成<br/>";
}else{
// echo "2/7". mysqli_error($conn)."<br/><br/>";
return "2/7 ".mysqli_error($conn);
}
// 3.使用数据表
// echo "3/7 选择数据库开始...<br/>";
$sql = "use {$db}";
mysqli_query($conn,$sql);
// echo "3/7 选择数据库完成<br/><br/>";
// 4.检查数据库是否存在
// echo "4/7 检测数据库开始...<br/>";
$sql = "DROP TABLE IF EXISTS `dic_s_use`";
mysqli_query($conn,$sql);
// echo "4/7 检测数据库完成<br/><br/>";
// 5.创建数据表 批量创建
// echo "5/7 创建数据表开始...<br/>";
// dic_s_use 表
$sql = "CREATE TABLE `dic_s_use` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`s_use` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '特殊用法',
`hospital_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '机构/医院代码',
`status` enum('0','1') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '状态:1=正常,0=禁用',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '特殊用法' ROW_FORMAT = Dynamic";
if (mysqli_query($conn,$sql)) {
// echo "5/7 数据表[dic_s_use]创建成功<br/>";
}else{
// echo "5/7 数据表[dic_s_use]创建失败".mysqli_error($conn)."<br/>";
return "5/7 数据表[dic_s_use]创建失败".mysqli_error($conn);
}
// 6.添加数据
// echo "6/7 添加数据开始...<br/>";
// dic_s_use 表
$insert_use = "(null, '另煎', 'ceshi', '1'),
(null, '先煎', 'ceshi', '1'),
(null, '后下', 'ceshi', '1'),
(null, '包煎', 'ceshi', '1'),
(null, '烊化', 'ceshi', '1'),
(null, '冲服', 'ceshi', '1'),
(null, '煎服', 'ceshi', '1')";
$sql = "INSERT INTO `dic_s_use` VALUES {$insert_use}";
if (mysqli_query($conn,$sql)) {
// echo "6/7 数据表[dic_s_use]数据导入成功<br/>";
}else{
// echo "6/7 数据表[dic_s_use]数据导入失败".mysqli_error($conn)."<br/>";
return "6/7 数据表[dic_s_use]数据导入失败".mysqli_error($conn);
}
// 7.关闭连接
// echo "7/7 数据库关闭连接开始...<br/>";
mysqli_close($conn);
// echo "7/7 数据库关闭连接完成<br/><br/><br/>";
return '200';
// echo "安装数据库完成<br/>";
}
到此这篇关于通过PHP安装数据库并使数据初始化的文章就介绍到这了,更多相关PHP数据初始化内容请搜索网赚博客http://www.piaodoo.com/以前的文章或继续浏览下面的相关文章希望大家以后多多支持网赚博客http://www.piaodoo.com/!
友情连接:
茂名一技http://www.szsyby.net/
茂名一技http://www.enechn.com/
美文集http://www.tpyjn.cn/
手游排行前十名http://www.bjkhrx.com/
可以使用json_decode()
, 至此,大功告成!
到此这篇关于PHP中使用grpc服务的教程详解的文章就介绍到这了,更多相关PHP使用grpc服务内容请搜索网赚博客http://www.piaodoo.com/以前的文章或继续浏览下面的相关文章希望大家以后多多支持网赚博客http://www.piaodoo.com/!
友情连接:
茂名一技http://www.szsyby.net/
茂名一技http://www.enechn.com/
美文集http://www.tpyjn.cn/
手游排行前十名http://www.bjkhrx.com/