提交 7e5e5460 编写于 作者: lzc828's avatar lzc828

rpc

上级 5738bf06
<?php
namespace One\Facades;
use One\Cache\File;
/**
* Class Cache
* @package Facades
* @mixin \One\Cache\Redis
* @mixin \Redis
* @method string get($key, \Closure $closure = null, $ttl = 0, $tags = []) static
* @method bool delRegex($key) static
* @method bool del($key) static
* @method bool flush($tag) static
* @method bool set($key, $val, $ttl = 0, $tags = []) static
* @method Redis setConnection($key)
*/
class Redis extends Facade
{
protected static function getFacadeAccessor()
{
return \One\Cache\Redis::class;
}
}
......@@ -32,7 +32,7 @@ class RpcServer
{
return self::ret([
'code' => $code,
'msg' => $msg
'msg' => $msg
]);
}
......@@ -57,15 +57,15 @@ class RpcServer
return self::error(400, '参数错误');
}
$c = $arr['c'];
$f = $arr['f'];
$c = $arr['c'];
$f = $arr['f'];
$id = $arr['i'];
$a = isset($arr['a']) ? $arr['a'] : [];
$t = isset($arr['t']) ? $arr['t'] : [];
$s = isset($arr['s']) ? $arr['s'] : 0;
$a = isset($arr['a']) ? $arr['a'] : [];
$t = isset($arr['t']) ? $arr['t'] : [];
$s = isset($arr['s']) ? $arr['s'] : 0;
try {
$info = self::isAllow($c, $f);
$obj = null;
$obj = null;
if (isset(self::$ids[$id])) {
$obj = self::$ids[$id];
}
......@@ -88,7 +88,7 @@ class RpcServer
$res = $c::$f(...$a);
} else {
if (isset($info['cache'])) {
$k = self::getCacheKey($c, $f, $a, $t);
$k = self::getCacheKey($c, $f, $a, $t);
$res = Cache::get($k);
if ($res !== false) {
return $res;
......@@ -174,4 +174,67 @@ class RpcServer
}
}
private function run($class)
{
foreach ($class as $c) {
$this->getClassInfo($c);
}
}
private function getClassInfo($class)
{
$info = ['class' => $class];
$class = new \ReflectionClass($class);
$funcs = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
foreach ($funcs as $func) {
$params = $func->getParameters();
$info['dir'] = dirname($func->getFileName());
$arr = [];
$arr['return'] = $func->getReturnType() ? '\\' . $func->getReturnType() . ' ' : '';
foreach ($params as $param) {
if ($param->getType()) {
$arr['params'][] = $param->getType() . ' $' . $param->getName();
} else {
$arr['params'][] = '$' . $param->getName();
}
}
if (!isset($arr['params'])) {
$arr['params'] = [];
}
$info['funcs'][$func->name] = $arr;
}
$this->createFacade($info);
}
private function createFacade($info)
{
$p = strrpos($info['class'], '\\');
$class = substr($info['class'], $p + 1);
$space = substr($info['class'], 0, $p);
$str = '<?php
namespace ' . substr($space, 1) . '\RpcHttpClient;
/**
* Class ' . $class . '
* @mixin ' . $info['class'] . PHP_EOL;
foreach ($info['funcs'] as $f => $f_info) {
$str .= ' * @method ' . $f_info['return'] . $f . '(' . implode(',', $f_info['params']) . ') static' . PHP_EOL;
}
$str .= '*/
class ' . $class . ' extends RpcHttpClient
{
protected static function getFacadeAccessor()
{
return ' . $info['class'] . '::class;
}
}';
$file = $info['dir'] . '/Facades/' . $class . '.php';
$dir = dirname($file);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
file_put_contents($file, $str);
}
}
......@@ -208,4 +208,32 @@ function get_co_id()
}
}
/**
* 分布式redis加锁
* @param $tag
*/
function redis_lock($tag)
{
$time = time();
$key = 'linelock:'.$tag;
while (!\One\Facades\Redis::setnx($key, $time + 3)) {
if ($time > \One\Facades\Redis::get($key) && $time > \One\Facades\Redis::getSet($key, $time + 3)) {
break;
} else {
usleep(10);
}
}
}
/**
* 分布式redis解锁
* @param $tag
*/
function redis_unlock($tag)
{
$key = 'linelock:'.$tag;
\One\Facades\Redis::del($key);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册