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擴展 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 擴展的自動加載文件 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-06php mysql操作mysql_connect連接數(shù)據(jù)庫實例詳解
php操作數(shù)據(jù)庫首先必須連接到指定的數(shù)據(jù)庫,連接數(shù)據(jù)庫可以使用PHP mysql_connect函數(shù),本文章向大家介紹mysql_connect函數(shù)的使用方法和實例,需要的朋友可以參考一下2016-12-12PHP中spl_autoload_register()和__autoload()區(qū)別分析
這篇文章主要介紹了spl_autoload_register()和__autoload()區(qū)別,需要的朋友可以參考下2014-05-05PHP字符串長度計算 - strlen()函數(shù)使用介紹
在PHP中,函數(shù)strlen()返回字符串的長度,strlen()函數(shù)返回字符串所占的字節(jié)長度,一個英文字母、數(shù)字、各種符號均占一個字節(jié),它們的長度均為12013-10-10php將數(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