syar:Swoole 实现的 Yar 服务

为何用swoole来实现 Yar server 历史代码使用了yar, 不想过多修改客户端代码 提升Yar服务端执行效率 学习swo

为何用swoole来实现 Yar server

  • 历史代码使用了yar, 不想过多修改客户端代码
  • 提升Yar服务端执行效率
  • 学习swoole, yar(在此感谢laruence,rango及swoole开发团队)

Require

  • php5.4+
  • ext-swoole 1.8.8+
  • ext-msgpack 如果yar使用msgpack编码方式

Install

composer require 'stcer/syar:*'

Example

服务端example/server.php

use syar/Server;use syar/log/File as FileLog;use syar/log/Log;$vendorPath = __Your vendor path__;/** @var /Composer/Autoload/ClassLoader $loader */$loader = include($vendorPath . "/autoload.php");$loader->addPsr4('syar//example//service//', __DIR__ . '/service');$server = new Server('0.0.0.0', '5604');$server->setLogger(new Log());$service = new /syar/example/service/Test();$server->setDispatcher(function(/syar/Token $token, $isDocument) use ($service){ if(!$isDocument){ $method = $token->getMethod(); $params = $token->getArgs(); $value = call_user_func_array(array($service, $method), $params); } else { $value = "Yar api document"; } return $value;});$server->run(['max_request' => 10000]);

example/service/Test.php

namespace syar/example/service;/** * Class Test * @package syar/example/service */class Test { public function getName($userName){ return $userName . " Hello"; } public function getAge(){ return 20; }}

命令行启动server.php

#php server.php

客户端

$url = "http://127.0.0.1:5604/test";$client = new Yar_client($url);$name = $client->getName("tester");$age = $client->getAge();//echo "<pre>/n";var_dump($name);var_dump($age);

扩展特性

接口批量请求

  • 批量请求的接口,服务端使用多个任务进程并行执行
  • 请求地址 http://{your_server_address}/multiple
  • 调用方法名 function calls($requests); $requests参数格式 [请求1数组, 请求2数组, ...], 请求数据格式:['api' => ApiName, 'method' => MethodName, 'params' => []]
  • 单个接口执行错误, 服务端记录错误日志, 返回['code' => CODE, 'error' => ERROR MESSAGE]格式数组, 客户端自行处理

客户端请求示例:

#example/client_mul.php$vendorPath = ...;$loader = include($vendorPath . "/autoload.php");$url = "http://127.0.0.1:5604/multiple";$client = new Yar_client($url);$calls = [ 'age' => [ 'api' => '/test', 'method' => 'getAge', 'params' => [] ], 'name' => [ 'api' => '/test', 'method' => 'getName', 'params' => [rand(1, 245301)] ]];$rs = $client->calls($calls);var_dump($rs);

投递任务到task进程异步执行

参考

  • TaskMananger->regTask()
  • TaskMananger->doTask()
  • TaskMananger->doTasks()
  • TaskMananger->doTasksAsync()

已知问题

  1. 未完成文档解析, 可使用自带的yar server显示文档
  2. 由于代码是从私有框架独立出来,可能存在未知bug
未登录用户
全部评论0
到底啦