原文:https://www.jianshu.com/p/800849778461
作者:谁不曾年少轻狂过
链接:https://www.jianshu.com/p/800849778461
第二个:echo $cli->getUserInfo(array('name' => '张三', 'age' => 27)); 调用
对应的tcpdump 抓的包 tcpdump tcp port 8000 -w mm.pcap
------------------------------------------------------------------------------------------------------------------
RPC全称为Remote Procedure Call,翻译过来为"远程过程调用"。主要应用于不同的系统之间的远程通信和相互调用。
文件结构
User.php
<?php
/**
* 服务文件
* Class User
*/
class User {
/**
* 获取用户ID
* @return string
*/
public function test() {
// todo
{
}
return '10000';
}
/**
* 获取用户信息
* @param $params
* @return string
*/
public function getUserInfo($params) {
// todo
{
}
return json_encode($params);
}
}
RpcServer.php
<?php
/**
* rpc 服务端
* Class RpcServer
*/
class RpcServer {
protected $serv = null;
/**
* 创建rpc服务,映射RPC服务
* RpcServer constructor.
* @param $host
* @param $port
* @param $path
*/
public function __construct($host, $port, $path) {
//创建tcp socket服务
$this->serv = stream_socket_server("tcp://{$host}:{$port}", $errno, $errstr);
if (!$this->serv) {
exit("{$errno} : {$errstr}
");
}
//RPC服务目录是否存在
$realPath = realpath(__DIR__ . $path);
if ($realPath === false || !file_exists($realPath)) {
exit("{$path} error
");
}
//解析数据,执行业务逻辑
while (true && $this->serv) {
$client = stream_socket_accept($this->serv);
if ($client) {
//读取并解析数据
$buf = fread($client, 2048);
$buf = json_decode($buf, true);
$class = $buf['class'];
$method = $buf['method'];
$params = $buf['params'];
//调用服务文件
if ($class && $method) {
$file = $realPath . '/' . $class . '.php';
if (file_exists($file)) {
require_once $file;
$obj = new $class();
//如果有参数,则传入指定参数
if (!$params) {
$data = $obj->$method();
} else {
$data = $obj->$method($params);
}
//返回结果
fwrite($client, $data);
}