首页 交互设计 正文

PHP实现创建一个RPC服务操作示例

时间:2020-04-23 21:01 作者:31网站目录 阅读:290 次

本文实例讲述了PHP实现创建一个RPC服务操作。分享给大家供大家参考,具体如下:

RPC全称为Remote Procedure Call,翻译过来为"远程过程调用"。主要应用于不同的系统之间的远程通信和相互调用。

比如有两个系统,一个是PHP写的,一个是JAVA写的,而PHP想要调用JAVA中的某个类的某个方法,这时候就需要用到RPC了。

怎么调?直接调是不可能,只能是PHP通过某种自定义协议请求JAVA的服务,JAVA解析该协议,在本地实例化类并调用方法,然后把结果返回给PHP。

这里我们用PHP的socket扩展来创建一个服务端和客户端,演示调用过程。

RpcServer.php代码如下:

	

code

  1. <?php
  2. class RpcServer {
  3. protected $serv = null;
  4. public function __construct($host, $port, $path) {
  5. //创建一个tcp socket服务
  6. $this->serv = stream_socket_server("tcp://{$host}:{$port}", $errno, $errstr);
  7. if (!$this->serv) {
  8. exit("{$errno} : {$errstr} \n");
  9. }
  10. //判断我们的RPC服务目录是否存在
  11. $realPath = realpath(__DIR__ . $path);
  12. if ($realPath === false || !file_exists($realPath)) {
  13. exit("{$path} error \n");
  14. }
  15. while (true) {
  16. $client = stream_socket_accept($this->serv);
  17. if ($client) {
  18. //这里为了简单,我们一次性读取
  19. $buf = fread($client, 2048);
  20. //解析客户端发送过来的协议
  21. $classRet = preg_match('/Rpc-Class:\s(.*);\r\n/i', $buf, $class);
  22. $methodRet = preg_match('/Rpc-Method:\s(.*);\r\n/i', $buf, $method);
  23. $paramsRet = preg_match('/Rpc-Params:\s(.*);\r\n/i', $buf, $params);
  24. if($classRet && $methodRet) {
  25. $class = ucfirst($class[1]);
  26. $file = $realPath . '/' . $class . '.php';
  27. //判断文件是否存在,如果有,则引入文件
  28. if(file_exists($file)) {
  29. require_once $file;
  30. //实例化类,并调用客户端指定的方法
  31. $obj = new $class();
  32. //如果有参数,则传入指定参数
  33. if(!$paramsRet) {
  34. $data = $obj->$method[1]();
  35. } else {
  36. $data = $obj->$method[1](json_decode($params[1], true));
  37. }
  38. //把运行后的结果返回给客户端
  39. fwrite($client, $data);
  40. }
  41. } else {
  42. fwrite($client, 'class or method error');
  43. }
  44. //关闭客户端
  45. fclose($client);
  46. }
  47. }
  48. }
  49. public function __destruct() {
  50. fclose($this->serv);
  51. }
  52. }
  53. new RpcServer('127.0.0.1', 8888, './service');

RpcClient.php代码如下:

	

code

  1. <?php
  2. class RpcClient {
  3. protected $urlInfo = array();
  4. public function __construct($url) {
  5. //解析URL
  6. $this->urlInfo = parse_url($url);
  7. if(!$this->urlInfo) {
  8. exit("{$url} error \n");
  9. }
  10. }
  11. public function __call($method, $params) {
  12. //创建一个客户端
  13. $client = stream_socket_client("tcp://{$this->urlInfo['host']}:{$this->urlInfo['port']}", $errno, $errstr);
  14. if (!$client) {
  15. exit("{$errno} : {$errstr} \n");
  16. }
  17. //传递调用的类名
  18. $class = basename($this->urlInfo['path']);
  19. $proto = "Rpc-Class: {$class};" . PHP_EOL;
  20. //传递调用的方法名
  21. $proto .= "Rpc-Method: {$method};" . PHP_EOL;
  22. //传递方法的参数
  23. $params = json_encode($params);
  24. $proto .= "Rpc-Params: {$params};" . PHP_EOL;
  25. //向服务端发送我们自定义的协议数据
  26. fwrite($client, $proto);
  27. //读取服务端传来的数据
  28. $data = fread($client, 2048);
  29. //关闭客户端
  30. fclose($client);
  31. return $data;
  32. }
  33. }
  34. $cli = new RpcClient('http://127.0.0.1:8888/test');
  35. echo $cli->hehe();
  36. echo $cli->hehe2(array('name' => 'test', 'age' => 27));

然后分别运行上面两个脚本(注意,php要添加环境变量)

	

code

  1. > php RpcServer.php
  2. > php RpcClient.php

Test.php代码如下:

	

code

  1. <?php
  2. class Test {
  3. public function hehe() {
  4. return 'hehe';
  5. }
  6. public function hehe2($params) {
  7. return json_encode($params);
  8. }
  9. }

共收录0个网站,0个公众号,0个小程序,0个资讯文章,0个微信文章
首页 关于我们 联系我们 收录标准 广告合作 免责声明 友情链接
点击收藏小提示:按键盘CTRL+D也能收藏哦! 本站关键词:网址大全 网址导航 网站大全 分类目录 免费分类目录网 网站目录大全 网站目录提交 网址目录 站长目录 中文分类目录 网站目录

网站声明:本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,31分类目录网不承担任何责任。在此特别感谢您对31分类目录网的支持与厚爱!
CopyRight © 2019-2020 Www.31dir.Com All Rights Reserved. 31分类目录版权所有:哈尔滨福创科技有限公司 黑ICP备15006982号-7
网站声明:本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,31网站目录不承担任何责任。在此特别感谢您对分类目录网的支持与厚爱!