php grpc 例子,php调用GRPC

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在PHP中使用gRPC方式调用Java服务端,需要分为以下步骤: 1. 安装gRPC PHP扩展 在PHP中使用gRPC需要安装gRPCPHP扩展。可以使用PECL来安装,命令如下: ```bash pecl install grpc ``` 安装完成后,需要在php.ini中添加以下配置: ``` extension=grpc.so ``` 2. 定义.proto文件 在Java中定义服务的.proto文件,例如: ``` syntax = "proto3"; package com.example; service MyService { rpc MyMethod (MyRequest) returns (MyResponse); } message MyRequest { string name = 1; } message MyResponse { string message = 1; } ``` 3. 生成Java和PHP代码 使用protobuf的编译器protoc来生成Java和PHP代码。可以在命令行中执行以下命令: ``` protoc --java_out=java_output_dir --grpc-java_out=java_output_dir --php_out=php_output_dir --grpc_out=php_output_dir --plugin=protoc-gen-grpc=/path/to/grpc_php_plugin my_service.proto ``` 其中,`java_output_dir`和`php_output_dir`分别是Java和PHP代码的输出目录。`/path/to/grpc_php_plugin`是gRPC PHP插件的路径。 4. 在Java中实现服务 在Java中实现MyService服务的方法,例如: ```java public class MyServiceImpl extends MyServiceGrpc.MyServiceImplBase { @Override public void myMethod(MyRequest request, StreamObserver<MyResponse> responseObserver) { String name = request.getName(); String message = "Hello, " + name + "!"; MyResponse response = MyResponse.newBuilder().setMessage(message).build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 5. 在Java中启动服务 在Java中启动gRPC服务,例如: ```java Server server = ServerBuilder.forPort(8080) .addService(new MyServiceImpl()) .build() .start(); server.awaitTermination(); ``` 6. 在PHP调用服务 在PHP中实现调用Java服务的代码,例如: ```php require_once __DIR__ . '/vendor/autoload.php'; $client = new MyServiceClient('localhost:8080', [ 'credentials' => Grpc\ChannelCredentials::createInsecure(), ]); $request = new MyRequest(); $request->setName('John'); list($response, $status) = $client->MyMethod($request)->wait(); if ($status->code !== Grpc\STATUS_OK) { echo "RPC failed with status: " . $status->code . ", details: " . $status->details; } else { echo $response->getMessage(); } ``` 需要注意的是,PHP中的gRPC库可能存在一些差异,需要根据具体情况进行调整。此外,在使用gRPC时,需要确保Java和PHP的版本号一致,以免出现不兼容的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值