日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2025/3/12 php 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 分布式环境 启动,极简.高性能.分布式框架,可运行于多种环境(apache/php-fpm,swoole)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

常規web/app后端服務器

im即時通訊服務器

tcp/udp物聯網服務器

綜合性項目,各種混合協議通訊

背景

在用過 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

在框架里。

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

總結

以上是生活随笔為你收集整理的php 分布式环境 启动,极简.高性能.分布式框架,可运行于多种环境(apache/php-fpm,swoole)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。