PHP中使用grpc服務(wù)的教程詳解
grpc是通過定義服務(wù)端和客戶端的代碼來實現(xiàn)的通信的。
但是要實現(xiàn)通信,還是要將其方法包裝為一個http請求,除非你把grpc的服務(wù)端代碼放在本地的端口上。
grpc是面對微服務(wù)框架而風(fēng)生水起的,上次我用python編寫了一個圖神經(jīng)網(wǎng)絡(luò)處理的微服務(wù),使用grpc放在我的服務(wù)器本地端口上。
現(xiàn)在我希望我的一個php項目也可以調(diào)用該服務(wù),現(xiàn)在來試一試吧~
流程
- php的服務(wù)器安裝protoc
- php的服務(wù)器安裝grpc
- 編寫服務(wù)端代碼
- 編寫客戶端代碼
由于服務(wù)端(python)的代碼已經(jīng)編寫或者說已經(jīng)部署,就不做敘述了。
安裝代碼請根據(jù)自己的php版本和grpc版本酌情自定義。本人使用的php8.0,grpc1.62.0,protobuf4.62.0
安裝protoc解釋器
和windows開發(fā)一樣,使用grpc服務(wù)均需要使用protoc解釋器,去官方github下的release下載linux版本:
解壓到/usr/bin/目錄下
如果你使用寶塔,你也可以直接先在本地電腦上解壓,把解壓后的bin文件夾里的protoc文件上傳到/usr/bin/中就好了。
終端中輸入protoc,有返回即為成功
安裝grpc
無論你服務(wù)器是否安裝pecl,可以直接通過http請求安裝php相關(guān)包,但是必須安裝了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擴(kuò)展 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服務(wù)就大功告成了
編譯protoc文件
具體的protoc文件的定義詳細(xì)見之前的博客
需要安裝protoc和grpc_php_plugin
使用如下代碼生成:
protoc --php_out ./ you-file.proto #需要安裝protoc解釋器,生成protoc的php定義文件在當(dāng)前目錄(./)
protoc --grpc_out ./ you-file.proto #需要grpc_php_plugin插件安裝,生成grpc文件在當(dāng)前目錄
第一行生成你的proto數(shù)據(jù)定義文件,我生成了GCNResult.php,Node.php,Edge.php,GraphData.php,同時還會生成一個GPBMetaData文件夾。
第二行生成php的grpc文件:GCNServiceClient.php
注意,如果你沒有生成grpc文件的插件(安裝grpc出現(xiàn)問題),可以直接下載該插件然后通過如下代碼生成xxxClient.php文件
protoc --grpc_out ./ --plugin=protoc-gen-grpc=/your-path-to-plugin/grpc_php_plugin you-filename.proto
編寫php請求的代碼(客戶端代碼)
編寫文件前置注意事項:
注意:如果你使用寶塔,需要把php設(shè)置里的禁用函數(shù)putenv和proc_open給刪除,不然composer安裝無法進(jìn)行。
需要編寫composer.json文件,因為使用了dirname(__FILE__).'/vendor/autoload.php'該自動導(dǎo)入功能。json文件內(nèi)容示例:
{
"require": {
"grpc/grpc": "*",
"google/protobuf": "*"
},
"autoload": {
"psr-4": {
"GPBMetadata\\": "protoc/GPBMetadata/",
"protoc\\": "protoc/"
}
}
}
編寫后在服務(wù)器該文件目錄下啟動終端輸入composer install即可,會生成vendor文件夾
現(xiàn)在我將編寫一個最簡單的php文件來調(diào)用這個服務(wù)。
<?php
require dirname(__FILE__).'/vendor/autoload.php'; // 引入 gRPC PHP 擴(kuò)展的自動加載文件
require 'protoc/GraphData.php'; // 引入包含 protoc文件夾下的grpc生成文件
require 'protoc/Node.php';
require 'protoc/Edge.php';
require 'protoc/GCNResult.php';
require 'protoc/GCNServiceClient.php';
// 進(jìn)行g(shù)rpc請求,獲取gcn處理后的數(shù)據(jù),返回json字符串
function GCN_request()
{
$client = new GCNServiceClient('localhost:9999', [
'credentials' => \Grpc\ChannelCredentials::createInsecure(),
]);
// 創(chuàng)建一個實例的圖數(shù)據(jù)
$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"),
]);
// 發(fā)送請求并接收響應(yīng)
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);
}
// 因為我的返回結(jié)果是個map數(shù)據(jù)類型,php中沒有該類型,需要做一個遍歷取值,如果是string類型可以直接取。
$NodeScores = [];
foreach ($response->getNodeScores() as $key => $value) {
$NodeScores[$key] = $value;
}
return json_encode($NodeScores);
}
該函數(shù)返回一個json數(shù)據(jù),想要修改可以使用json_decode() , 至此,大功告成!
到此這篇關(guān)于PHP中使用grpc服務(wù)的教程詳解的文章就介紹到這了,更多相關(guān)PHP使用grpc服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入理解PHP之?dāng)?shù)組(遍歷順序) Laruence原創(chuàng)
經(jīng)常會有人問我, PHP的數(shù)組, 如果用foreach來訪問, 遍歷的順序是固定的么? 以什么順序遍歷呢?下面看Laruence整理的2012-06-06
php mysql操作mysql_connect連接數(shù)據(jù)庫實例詳解
php操作數(shù)據(jù)庫首先必須連接到指定的數(shù)據(jù)庫,連接數(shù)據(jù)庫可以使用PHP mysql_connect函數(shù),本文章向大家介紹mysql_connect函數(shù)的使用方法和實例,需要的朋友可以參考一下2016-12-12
PHP中spl_autoload_register()和__autoload()區(qū)別分析
這篇文章主要介紹了spl_autoload_register()和__autoload()區(qū)別,需要的朋友可以參考下2014-05-05
PHP字符串長度計算 - strlen()函數(shù)使用介紹
在PHP中,函數(shù)strlen()返回字符串的長度,strlen()函數(shù)返回字符串所占的字節(jié)長度,一個英文字母、數(shù)字、各種符號均占一個字節(jié),它們的長度均為12013-10-10
php將數(shù)據(jù)庫導(dǎo)出成excel的方法
有時寫程序時后臺要求把大量數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中,比如考試成績、電話簿等一般都是存放在excel中的數(shù)據(jù),這時我們可把excel導(dǎo)出成csv文件,然后通過以下程序即可批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中2010-05-05

