<?php /** * Grpc 服务类 * * 1,composer.json 中 添加 "GPBMetadata\\":"proto/GPBMetadata/" ,composer dump * 2,在proto文件夹下创建 .proto文件 * 注意:package GPBMetadata.repository; 添加前缀 GPBMetadata * 3,在grpc文件中执行 /usr/local/protoc/bin/protoc --php_out=. *.proto * 4,使用例子1 * $method = "workorder.workOrderService/GetWorkOrderList"; //服务方提供 * $request_obj = new \GPBMetadata\Workorder\SearchRequest($set_data); //要组装的数据对像 * $set_data = ['start_city_id' => 1,'end_city_id'=>100]; * $replay ='GPBMetadata\Workorder\ResultReply 或 直接使用文件夹名 Workorder'; * $clien = new App\Services\GrpcService(); * $clien->execute($method, $request_obj,$replay); * * 5,使用例子2,查2次grpc * $grpc = new GrpcService(config("grpc.service_url.ducms")); //main_line_repository $method = '/ducms_main_line_repository.MainLineRepositoryService/GetMainLineRepositoryList'; $query = new Query(); //$query->setSqlQuery("status=10 and repositoryid=" . $repository_id); $line = new MainLineRepository(); $line->setStatus(10); $line->setRepositoryid($repository_id); $query->setEntityQuery($line); $res = $grpc->execute($method, $query, new ListResult()); $repos = $res->getData(); if(!count($repos)){ return true; } $mainLineIds=''; foreach ($repos as $k=>$v){ if ($v instanceof MainLineRepository ) { $mainLineIds.=$v->getMainLineId().','; } } $mainLineIds = trim($mainLineIds,','); //检查另一张表数据 main_line $method = '/ducms_main_line.MainLineService/GetMainLine'; $query = new \GPBMetadata\Dcms_main_line\Query(); $query->setSqlQuery("id in({$mainLineIds})"); $res = $grpc->execute($method, $query, new \GPBMetadata\Ducms_main_line\EntityResult()); $repos = $res->getData(); if ($repos instanceof MainLine ) { return false; }else{ return true; } * * @filename GrpcService.php * @author Zhenxun Du <5552123@qq.com> * @date 2019/6/22 14:28 * @version $Id$ */ namespace App\Services; use App\Entity\Result; use App\Library\Common; use Illuminate\Support\Facades\Log; class GrpcService extends \Grpc\BaseStub { public $server_url; public function __construct($server_url = '') { $this->server_url = $server_url ? $server_url : config("grpc.service_url.default"); parent::__construct($this->server_url, ['credentials' => \Grpc\ChannelCredentials::createInsecure()]); } /** * 执行rpc * @param string $method 服务端提供 /workorder.workOrderService/GetWorkOrderList * @param object $request_obj 要发送的数据对像 * @param object $response_obj 响应结果对像 * @return Result */ public function execute($method, $request_obj, $response_obj) { $result = new Result(); try { //尝试2次 $i = 0; while ($i < 2) { $res = $this->_simpleRequest($method, $request_obj, [$response_obj, 'decode']); list($reply, $status) = $res->wait(); if ($reply instanceof $response_obj) { break; } else { //echo $i.PHP_EOL; usleep(1000000); $i++; } } $res_data = $reply->getData(); if (is_string($res_data)) { $data = json_decode($reply->getData(), true) ?: $reply->getData(); } else { $data = $res_data; } $result->setCode(Result::CODE_SUCCESS)->setData($data); } catch (\Exception $e) { //记录日志 .... $result->setCode(Result::CODE_ERROR)->setMsg('系统繁忙,请重试!'); } return $result; } } --------------------- 版权声明:本文为CSDN博主「duzhenxun」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/duzhenxun/article/details/96483463
PHP调用grpc
于 2019-08-07 19:03:27 首次发布