摘要:于是打算做一個擁有非常好用的路由和又非常簡單的框架。但也有一些自己的特色,例如支持自動化緩存自動化讀寫刷新保持與數(shù)據(jù)庫同步,對外使用無感知。例如協(xié)議服務器地址遠程的類不設置默認為當前類名其中類在框架里。
背景
在用過laravel框架,發(fā)現(xiàn)它的路由和數(shù)據(jù)庫ORM確實非常好用,但是整體確實有點慢,執(zhí)行到控制器大于需要耗時60ms左右。于是打算做一個擁有非常好用的路由和orm又非常簡單的框架。所以你會發(fā)現(xiàn)one框的路由和ORM有l(wèi)aravel的影子。但也有一些自己的特色,例如ORM支持自動化緩存(自動化讀、寫、刷新)保持與數(shù)據(jù)庫同步,對外使用無感知。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……任意協(xié)議路由
ORM模型
統(tǒng)一的session處理
mysql連接池
redis連接池
tcp連接池
HTTP/TCP/WEBOSCKET/UDP服務器
緩存
進程間內存共享
RPC(http,tcp,udp)
日志
RequestId跟蹤
路由Router::get("/", AppControllersIndexController::class . "@index"); // 帶參數(shù)路由 Router::get("/user/{id}", AppControllersIndexController::class . "@user"); // 路由分組 Router::group(["namespace"=>"AppTestWebSocket"],function (){ // websocket 路由 Router::set("ws","/a","TestController@abc"); Router::set("ws","/b","TestController@bbb"); }); // 中間件 Router::group([ "middle" => [ AppTestMixProTestMiddle::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 AppModel; use OneDatabaseMysqlModel; // 模型里面不需要指定主鍵,框架會緩存數(shù)據(jù)庫結構 // 自動匹配主鍵,自動過濾非表結構里的字段 class User extends Model { // 定義模型對應的表名 CONST TABLE = "users"; // 定義關系 public function articles() { return $this->hasMany("id",Article::class,"user_id"); } // 定義事件 // 是否開啟自動化緩存 // …… }使用模型
在fpm下數(shù)據(jù)庫連接為單列,
在swoole模式下數(shù)據(jù)庫連接自動切換為連接池
// 查詢一條記錄 $user = User::find(1); // 關聯(lián)查詢 $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 為影響記錄數(shù)量緩存
// 設置緩存 Cache::set("ccc",1); // 獲取 Cache::get("ccc"); // 或者 緩存ccc 過期10s 在tag1下面 Cache::get("ccc",function (){ return "緩存的信息"; },10,["tag1"]); // 刷新tag1下的所有緩存 Cache::flush("tag1");HTTP/TCP/WEBOSCKET/UDP服務器
啟動一個websocket服務器,
添加http服務監(jiān)聽,
添加tcp服務監(jiān)聽
[ // 主服務器 "server" => [ "server_type" => OneSwooleOneServer::SWOOLE_WEBSOCKET_SERVER, "port" => 8082, // 事件回調 "action" => OneSwooleServerWsServer::class, "mode" => SWOOLE_PROCESS, "sock_type" => SWOOLE_SOCK_TCP, "ip" => "0.0.0.0", // swoole 服務器設置參數(shù) "set" => [ "worker_num" => 5 ] ], // 添加監(jiān)聽 "add_listener" => [ [ "port" => 8081, // 事件回調 "action" => AppServerAppHttpPort::class, "type" => SWOOLE_SOCK_TCP, "ip" => "0.0.0.0", // 給監(jiān)聽設置參數(shù) "set" => [ "open_http_protocol" => true, "open_websocket_protocol" => false ] ], [ "port" => 8083, // 打包 解包協(xié)議 "pack_protocol" => OneProtocolText::class, // 事件回調 "action" => AppTestMixProTcpPort::class, "type" => SWOOLE_SOCK_TCP, "ip" => "0.0.0.0", // 給監(jiān)聽設置參數(shù) "set" => [ "open_http_protocol" => false, "open_websocket_protocol" => false ] ] ] ];RPC
像調用本項目的方法一樣調用遠程服務器的方法??缯Z言,跨機器。
服務端啟動rpc服務,框架已經內置了各個協(xié)議的rpc服務,添加到到上面配置文件的action即可。列如: 支持http調用,又支持tpc調用。
// http 協(xié)議 rpc服務 [ "port" => 8082, "action" => AppServerRpcHttpPort::class, "type" => SWOOLE_SOCK_TCP, "ip" => "0.0.0.0", "set" => [ "open_http_protocol" => true, "open_websocket_protocol" => false ] ], // tpc 協(xié)議 rpc服務 [ "port" => 8083, "action" => AppServerRpcTcpPort::class, "type" => SWOOLE_SOCK_TCP, "pack_protocol" => OneProtocolFrame::class, // tcp 打包 解包協(xié)議 "ip" => "0.0.0.0", "set" => [ "open_http_protocol" => false, "open_websocket_protocol" => false, "open_length_check" => 1, "package_length_func" => "OneProtocolFrame::length", "package_body_offset" => OneProtocolFrame::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([ // // 中間件 在這里可以做 權限驗證 數(shù)據(jù)加解密 等等 // "middle" => [ // TestMiddle::class . "@aa" // ], // // 緩存 如果設置了 當以同樣的參數(shù)調用時 會返回緩存信息 不會真正調用 單位:秒 // "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協(xié)議調用的。你也可以通過其他協(xié)議調用。例如Tpc協(xié)議
class ClientAbc extends RpcClientTcp { // rpc服務器地址 protected $_rpc_server = "tcp://127.0.0.1:8083/"; // 遠程的類 不設置 默認為當前類名 protected $_remote_class_name = "Abc"; }
其中類 RpcClientHttp,RpcClientTcp在框架里。
你也可以復制到任何其他地方使用。
github
QQ交流群: 731475644
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29824.html
摘要:框架最新源代碼行數(shù)行,因此可以很容易的改造它,成為你們公司的專屬框架。也不同于其他基于的微服務框架,只聚焦于微服務治理,定位于開發(fā)的更多領域,覆蓋從初創(chuàng)到億元級體量的技術訴求。的授權全靠用戶自愿購買,詳情 MixPHP是什么 MixPHP 是秉承 普及 PHP 常駐內存型解決方案,促進 PHP 往更后端發(fā)展 的理念而創(chuàng)造,采用 Swoole 擴展作為底層引擎,圍繞常駐內存的方式而設計,...
摘要:年月日,在上海舉行的第六屆中國開發(fā)者大會上,騰訊開源項目首次全面發(fā)布版本,閱文集團高級開發(fā)工程師梁晨對如何通過構建高性能框架做了經驗分享。分享內容作為騰訊開源的框架,在發(fā)布之后即受到開源領域的關注。閱文集團本身也有一塊新的業(yè)務在使用。 2018年5月19日,在上海舉行的第六屆中國PHP開發(fā)者大會(PHPCon)上,騰訊開源項目TARS首次全面發(fā)布PHP版本,閱文集團高級開發(fā)工程師梁晨對...
摘要:介紹是基于開發(fā)的協(xié)程開發(fā)框架,擁有常駐內存協(xié)程異步非阻塞等優(yōu)點。宇潤我在年開發(fā)并發(fā)布了第一個框架,一直維護使用至今,非常穩(wěn)定,并且有文檔。于是我走上了開發(fā)的不歸路 showImg(https://segmentfault.com/img/bVbcxQH?w=340&h=160); 介紹 IMI 是基于 Swoole 開發(fā)的協(xié)程 PHP 開發(fā)框架,擁有常駐內存、協(xié)程異步非阻塞IO等優(yōu)點。...
摘要:是一個基于擴展實現(xiàn)的輕量級高性能的常駐內存型的和應用服務框架高度封裝了,,服務器,以及基于實現(xiàn)可擴展的服務,同時支持包方式安裝部署項目?;趯嵱?,抽象事件處理類,實現(xiàn)與底層的回調的解耦,支持同步異步調用,內置等常用組件等。 swoolefy swoolefy是一個基于swoole擴展實現(xiàn)的輕量級高性能的常駐內存型的API和Web應用服務框架,高度封裝了http,websocket,ud...
摘要:易用穩(wěn)定,本次想通過對的學習和個人解析,吸收框架的思想和設計知識,加強自己對的認知和理解。當然,筆者能力水平有限,后續(xù)的文章如有錯誤,還請指出和諒解。目錄如下后續(xù)添加文章都會記錄在此服務啟動過程以及主體設計流程源碼解析 前言 swoole是什么?官網的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 ...
閱讀 1058·2021-11-12 10:34
閱讀 985·2021-09-30 09:56
閱讀 668·2019-08-30 15:54
閱讀 2602·2019-08-30 11:14
閱讀 1465·2019-08-29 16:44
閱讀 3203·2019-08-29 16:35
閱讀 2489·2019-08-29 16:22
閱讀 2441·2019-08-29 15:39