国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一個極簡的基于swoole常駐內存框架

Steve_Wang_ / 3623人閱讀

摘要:于是打算做一個擁有非常好用的路由和又非常簡單的框架。但也有一些自己的特色,例如支持自動化緩存自動化讀寫刷新保持與數(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

相關文章

  • MixPHP:基于 Swoole常駐內存型 PHP 框架

    摘要:框架最新源代碼行數(shù)行,因此可以很容易的改造它,成為你們公司的專屬框架。也不同于其他基于的微服務框架,只聚焦于微服務治理,定位于開發(fā)的更多領域,覆蓋從初創(chuàng)到億元級體量的技術訴求。的授權全靠用戶自愿購買,詳情 MixPHP是什么 MixPHP 是秉承 普及 PHP 常駐內存型解決方案,促進 PHP 往更后端發(fā)展 的理念而創(chuàng)造,采用 Swoole 擴展作為底層引擎,圍繞常駐內存的方式而設計,...

    王晗 評論0 收藏0
  • 干貨| PHPCon上TARS-PHP全面解讀及PPT下載

    摘要:年月日,在上海舉行的第六屆中國開發(fā)者大會上,騰訊開源項目首次全面發(fā)布版本,閱文集團高級開發(fā)工程師梁晨對如何通過構建高性能框架做了經驗分享。分享內容作為騰訊開源的框架,在發(fā)布之后即受到開源領域的關注。閱文集團本身也有一塊新的業(yè)務在使用。 2018年5月19日,在上海舉行的第六屆中國PHP開發(fā)者大會(PHPCon)上,騰訊開源項目TARS首次全面發(fā)布PHP版本,閱文集團高級開發(fā)工程師梁晨對...

    JasonZhang 評論0 收藏0
  • IMI 基于 Swoole 開發(fā)的協(xié)程 PHP 開發(fā)框架 常駐內存、協(xié)程異步非阻塞

    摘要:介紹是基于開發(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)點。...

    airborne007 評論0 收藏0
  • swoolefy-基于swoole擴展實現(xiàn)的高性能的常駐內存型API和Web應用服務框架

    摘要:是一個基于擴展實現(xiàn)的輕量級高性能的常駐內存型的和應用服務框架高度封裝了,,服務器,以及基于實現(xiàn)可擴展的服務,同時支持包方式安裝部署項目?;趯嵱?,抽象事件處理類,實現(xiàn)與底層的回調的解耦,支持同步異步調用,內置等常用組件等。 swoolefy swoolefy是一個基于swoole擴展實現(xiàn)的輕量級高性能的常駐內存型的API和Web應用服務框架,高度封裝了http,websocket,ud...

    lewinlee 評論0 收藏0
  • Easyswoole 源碼學習和個人解析 目錄

    摘要:易用穩(wěn)定,本次想通過對的學習和個人解析,吸收框架的思想和設計知識,加強自己對的認知和理解。當然,筆者能力水平有限,后續(xù)的文章如有錯誤,還請指出和諒解。目錄如下后續(xù)添加文章都會記錄在此服務啟動過程以及主體設計流程源碼解析 前言 swoole是什么?官網的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 ...

    CoXie 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<