• 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们

宿迁腾云网络网站建设公司

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们
首页 > 行业动态 > 技术日志 > 极简-高性能-分布式框架,可运行于多种环境(apache/php-fpm,swoole)

极简-高性能-分布式框架,可运行于多种环境(apache/php-fpm,swoole)

2019-07-20469

  1. 常规web/app后端服务器

  2. im即时通讯服务器

  3. tcp/udp物联网服务器

  4. 综合性项目,各种混合协议通讯

背景

在用过 laravel 框架,发现它的 路由 和 数据库ORM 确实非常好用,但是整体确实有点慢,执行到控制器大约需要耗时30ms左右。于是打算做一个拥有非常好用的路由和orm又非常简单的框架。所以你会发现one框架的 路由 和 ORM 有laravel的影子。但也有一些自己的特色,例如 ORM 支持自动化缓存(自动化读、写、刷新)保持与数据库同步,对外使用无感知。one框架也支持在fpm下运行,在 fpm 下框架自身整体耗时在1ms左右。

hello world

安装

composer create-project lizhichao/one-app app
cd app
php App/swoole.php
复制代码

测试

curl http://127.0.0.1:8081/
复制代码

主要功能

  • RESTful路由

  • 中间件

  • websocket/tcp/http……任意协议路由

  • ORM模型

  • 统一的session处理

  • mysql连接池

  • redis连接池

  • 协程 tcp-client 连接池

  • HTTP/TCP/WEBOSCKET/UDP服务器

  • 缓存

  • 进程间内存共享

  • RPC(http,tcp,udp)

  • 日志

  • RequestId跟踪

  • 分布式(长连接,事务……)

路由

Router::get('/', \App\Controllers\IndexController::class . '@index');

// 带参数路由
Router::get('/user/{id}', \App\Controllers\IndexController::class . '@user');

// 路由分组
Router::group(['namespace'=>'App\\Test\\WebSocket'],function (){
// websocket 路由
   Router::set('ws','/a','TestController@abc');
   Router::set('ws','/b','TestController@bbb');
});

// 中间件
Router::group([
   'middle' => [
       \App\Test\MixPro\TestMiddle::class . '@checkSession'
   ]
], function () {
   Router::get('/mix/ws', HttpController::class . '@ws');
   Router::get('/mix/http', HttpController::class . '@http');
   Router::post('/mix/http/loop', HttpController::class . '@httpLoop');
   Router::post('/mix/http/send', HttpController::class . '@httpSend');
});

复制代码

orm 模型

定义模型

namespace App\Model;

use One\Database\Mysql\Model;

// 模型里面不需要指定主键,框架会缓存数据库结构
// 自动匹配主键,自动过滤非表结构里的字段
class User extends Model
{
// 定义模型对应的表名
   CONST TABLE = 'users';

// 定义关系
   public function articles()
   {
       return $this->hasMany('id',Article::class,'user_id');
   }
   
   // 定义事件
   // 是否开启自动化缓存
   // ……
}
复制代码

使用模型

fpm
swoole
// 查询一条记录
$user = User::find(1);

// 关联查询
$user_list = User::whereIn('id',[1,2,3])->with('articles')->findAll()->toArray();

// 更新
$r = $user->update(['name' => 'aaa']);
// 或者
$r = user::where('id',1)->update(['name' => 'aaa']);
// $r 为影响记录数量

复制代码

缓存

// 设置缓存 无过期时间
Cache::set('ccc',1);

// 设置缓存 1分钟过期
Cache::set('ccc',1,60);

// 获取
Cache::get('ccc');

// 或者 缓存ccc 过期10s 在tag1下面
Cache::get('ccc',function (){
   return '缓存的信息';
},10,['tag1']);

// 刷新tag1下的所有缓存
Cache::flush('tag1');

复制代码

HTTP/TCP/WEBSOCKET/UDP服务器

启动一个websocket服务器, 添加http服务监听, 添加tcp服务监听

[
// 主服务器
   'server' => [
       'server_type' => \One\Swoole\OneServer::SWOOLE_WEBSOCKET_SERVER,
       'port' => 8082,
       // 事件回调
       'action' => \One\Swoole\Server\WsServer::class,
       'mode' => SWOOLE_PROCESS,
       'sock_type' => SWOOLE_SOCK_TCP,
       'ip' => '0.0.0.0',
       // swoole 服务器设置参数
       'set' => [
           'worker_num' => 5
       ]
   ],
   // 添加监听
   'add_listener' => [
       [
           'port' => 8081,
           // 事件回调
           'action' => \App\Server\AppHttpPort::class,
           'type' => SWOOLE_SOCK_TCP,
           'ip' => '0.0.0.0',
           // 给监听设置参数
           'set' => [
               'open_http_protocol' => true,
               'open_websocket_protocol' => false
           ]
       ],
       [
           'port' => 8083,
           // 打包 解包协议
           'pack_protocol' => \One\Protocol\Text::class,
           // 事件回调
           'action' => \App\Test\MixPro\TcpPort::class,
           'type' => SWOOLE_SOCK_TCP,
           'ip' => '0.0.0.0',
           // 给监听设置参数
           'set' => [
               'open_http_protocol' => false,
               'open_websocket_protocol' => false
           ]
       ]
   ]
];


复制代码

RPC

像调用本项目的方法一样调用远程服务器的方法。跨语言,跨机器。

服务端

启动rpc服务,框架已经内置了各个协议的rpc服务,添加到到上面配置文件的 action 即可。列如: 支持 http 调用,又支持 tcp 调用。

// http 协议 rpc服务
[
   'port'   => 8082,
   'action' => \App\Server\RpcHttpPort::class,
   'type'   => SWOOLE_SOCK_TCP,
   'ip'     => '0.0.0.0',
   'set'    => [
       'open_http_protocol'      => true,
       'open_websocket_protocol' => false
   ]
],
// tcp 协议 rpc服务
[
   'port'          => 8083,
   'action'        => \App\Server\RpcTcpPort::class,
   'type'          => SWOOLE_SOCK_TCP,
   'pack_protocol' => \One\Protocol\Frame::class, // tcp 打包 解包协议
   'ip'            => '0.0.0.0',
   'set'           => [
       'open_http_protocol'      => false,
       'open_websocket_protocol' => false,
       'open_length_check'       => 1,
       'package_length_func'     => '\One\Protocol\Frame::length',
       'package_body_offset'     => \One\Protocol\Frame::HEAD_LEN,
   ]
]
复制代码

添加具体服务到rpc, 例如有个类 Abc

class Abc
{
   private $a;

   // 初始值
   public function __construct($a = 0)
   {
       $this->a = $a;
   }

   // 加法
   public function add($a, $b)
   {
       return $this->a + $a + $b;
   }

   public function time()
   {
       return date('Y-m-d H:i:s');
   }

   // 重新设初始值
   public function setA($a)
   {
       $this->a = $a;
       return $this;
   }
}

复制代码

把 Abc 添加到rpc服务

// 添加Abc到rpc服务
RpcServer::add(Abc::class);

// 如果你不希望把Abc下的所有方法都添加到rpc服务,也可以指定添加。
// 未指定的方法客户端无法调用.
//RpcServer::add(Abc::class,'add');

// 分组添加
//RpcServer::group([
//    // 中间件 在这里可以做 权限验证 数据加解密 等等
//    'middle' => [
//        TestMiddle::class . '@aa'
//    ],
//    // 缓存 如果设置了 当以同样的参数调用时 会返回缓存信息 不会真正调用 单位:秒
//    'cache'  => 10
//], function () {
//    RpcServer::add(Abc::class);
//    RpcServer::add(User::class);
//});
复制代码

客户端调用

为了方便调用我们建立一个映射类(one框架可自动生成)

class ClientAbc extends RpcClientHttp {

   // rpc服务器地址
   protected $_rpc_server = 'http://127.0.0.1:8082/';

   // 远程的类 不设置 默认为当前类名
   protected $_remote_class_name = 'Abc';
}
复制代码

调用rpc服务的远程方法, 和调用本项目的方法一样的。你可以想象这个方法就在你的项目里面。

$abc = new ClientAbc(5);

// $res === 10
$res = $abc->add(2,3);

// 链式调用 $res === 105
$res = $abc->setA(100)->add(2,3);

// 如果把上面的模型的User添加到rpc
// RpcServer::add(User::class);
// 下面运行结果和上面一样
// $user_list = User::whereIn('id',[1,2,3])->with('articles')->findAll()->toArray();

复制代码

上面是通过http协议调用的。你也可以通过其他协议调用。例如Tcp协议

class ClientAbc extends RpcClientTcp {

   // rpc服务器地址
   protected $_rpc_server = 'tcp://127.0.0.1:8083/';

   // 远程的类 不设置 默认为当前类名
   protected $_remote_class_name = 'Abc';
}
复制代码

其中类 RpcClientHttp , RpcClientTcp 在框架里。

你也可以复制到任何其他地方使用。


Tag:
网站制作公众号

宿迁腾云网络网站建设公司 | 网站开发 | 网站制作 | 网站优化

咨询电话:13160355545

上一篇

返回栏目

下一篇

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

热推

  • C语言市场大跌在下方的走势图上可以更明显看出
  • 上图中哪个框架是你的“菜”呢?
  • php网站集成支付宝接口开发者在线课程首发!中文免费在线资源助你提升开发技能(图)php网站支付宝接口
  • 可重用代码的集合,框架代码是框架架构的代码
  • 基于图形块的编程语言,进入了指数前20名
  • 本站所发布的一切破解补丁、注册机和注册信息及软件的解密
  • 优化四步骤认真看仔细学
  • php技术写过几篇关于C#的文章,引来了了不少讨论。 爬虫技术 php
  • php绑定域名授权代码一下如何做一些修改让多个域名可以绑定到同一个空间上php域名授权
  • php框架排名数据库操作数据库和ORM组件发展最快组件的入门难度php开发框架流行度排名

相关

标签

seo(1182) 市场营销(661) 网站制作(573) 网站建设(564) 搜索引擎(553) 网站(482) PHP(361) 编程语言(345) 建站(294) 关键词排名优化(267) 网站建设公司(245) 优化(216) seo排名(207) 域名(190) 软件(171) 网站优化(148) 搜索引擎优化(146) 外链(141) 科技(136) 网站关键词(124) 网站排名优化(123) 域名服务器(120) 网站排名(107) 时政(103) 排名优化(95) 搜索引擎收录(93) 网站设计(92) 电子商务(88) 引擎(86) 移动互联网(85) 开发框架(79) 开发(75) 网站服务器(74) 框架(68) 前端开发(68) 网站分析(66) 网站建设方案(65) 关键(64) 流量(63) 源码(62) 百度优化(62) 网站权重(61) 开放源代码(59) seo培训(53) 网页设计(51) 百度(51) php框架(50) 网站建设知识(50) 大数据(50) 谷歌(49)
宿迁腾云网络网站建设公司
网站建设
  • 私人定制
  • 标准模板建站
  • 经济模板建站
精品模板

宿迁腾云网络网站建设公司

联系电话:13160355545

公司地址:江苏省宿迁市丽景湾华庭北门都市花园公寓9楼907

联系邮箱:admin@tyweb.net

全国分站
  • 北京
  • 广东
  • 东莞 广州 中山 深圳 惠州 江门 珠海 汕头 佛山 湛江 河源 肇庆 潮州 清远 韶关 揭阳 阳江 云浮 茂名 梅州 汕尾
  • 山东
  • 济南 青岛 临沂 济宁 菏泽 烟台 泰安 淄博 潍坊 日照 威海 滨州 东营 聊城 德州 莱芜 枣庄
  • 江苏
  • 苏州 徐州 盐城 无锡 南京 南通 连云港 常州 扬州 镇江 淮安 泰州 宿迁
  • 河南
  • 郑州 南阳 新乡 安阳 洛阳 信阳 平顶山 周口 商丘 开封 焦作 驻马店 濮阳 三门峡 漯河 许昌 鹤壁 济源
  • 上海
  • 河北
  • 石家庄 唐山 保定 邯郸 邢台 沧州 秦皇岛 张家口 衡水 廊坊 承德
  • 浙江
  • 温州 宁波 杭州 台州 嘉兴 金华 湖州 绍兴 舟山 丽水 衢州
  • 陕西
  • 西安 咸阳 宝鸡 汉中 渭南 安康 榆林 商洛 延安 铜川
  • 湖南
  • 长沙 邵阳 常德 衡阳 株洲 湘潭 永州 岳阳 怀化 郴州 娄底 益阳 张家界 湘西
  • 重庆
  • 福建
  • 漳州 泉州 厦门 福州 莆田 宁德 三明 南平 龙岩
  • 天津
  • 云南
  • 昆明 红河 大理 文山 德宏 曲靖 昭通 楚雄 保山 玉溪 丽江 临沧 思茅 西双版纳 怒江 迪庆
  • 四川
  • 成都 绵阳 广元 达州 南充 德阳 广安 阿坝 巴中 遂宁 内江 凉山 攀枝花 乐山 自贡 泸州 雅安 宜宾 资阳 眉山 甘孜
  • 广西
  • 贵港 玉林 北海 南宁 柳州 桂林 梧州 钦州 来宾 河池 百色 贺州 崇左 防城港
  • 安徽
  • 芜湖 合肥 六安 宿州 阜阳 安庆 马鞍山 蚌埠 淮北 淮南 宣城 黄山 铜陵 亳州 池州 巢湖 滁州
  • 海南
  • 三亚 海口 琼海 文昌 东方
  • 江西
  • 南昌 赣州 上饶 吉安 九江 新余 抚州 宜春 景德镇 萍乡 鹰潭
  • 湖北
  • 武汉 宜昌 襄樊 荆州 恩施 孝感 黄冈 十堰 咸宁 黄石 仙桃 随州 天门 荆门 潜江 鄂州 神农架
  • 山西
  • 太原 大同 运城 长治 晋城 忻州 临汾 吕梁 晋中 阳泉 朔州
  • 辽宁
  • 大连 沈阳 丹东 辽阳 葫芦岛 锦州 朝阳 营口 鞍山 抚顺 阜新 本溪 盘锦 铁岭
  • 黑龙江
  • 齐齐哈尔 哈尔滨 大庆 佳木斯 双鸭山 牡丹江 鸡西 黑河 绥化 鹤岗 伊春 大兴安岭 七台河
  • 内蒙古
  • 赤峰 包头 通辽 呼和浩特 乌海 鄂尔多斯 呼伦贝尔
  • 贵州
  • 贵阳 黔东 黔南 遵义 黔西 毕节 铜仁 安顺 六盘水
  • 甘肃
  • 兰州 天水 庆阳 武威 酒泉 张掖 陇南 白银 定西 平凉 嘉峪关 临夏 金昌 甘南
  • 青海
  • 西宁 海西 海东 海北 果洛 玉树 黄南
  • 新疆
  • 乌鲁木齐 伊犁 昌吉 石河子 哈密
  • 西藏
  • 拉萨 山南 林芝 日喀则
  • 吉林
  • 长春 白山 白城 延边 松原 辽源 通化 四平
  • 宁夏
  • 银川 吴忠 中卫 石嘴山 固原
SiteMap
网站地图
TAG标签
Copyright © 2017-2025 TYWEB.NET 宿迁腾云网络科技有限公司 ALL RIGHTS RESERVED.   苏ICP备17033535号-1

热门搜索

百度 下载 2025 2024 2026 货源 货货源 虚拟 禅道 报名 金蝶KIS旗舰版
  • 客服

    在线客服

  • 电话

    13160355545

  • 微信

精品模板
建站费用
成功案例
联系我们