├── ws-session.md ├── tcp-session.md ├── book.json ├── images └── screenshot_1541494181350.png ├── 进程间数据共享.md ├── 注意事项.md ├── 模型-事物.md ├── 路由分组.md ├── 接口缓存.md ├── Session.md ├── http控制器.md ├── 介绍.md ├── 路由设置别名.md ├── Response.md ├── websocket服务器.md ├── 模型事件.md ├── default.md ├── 事件.md ├── swoole相关.md ├── 路由中间件.md ├── SUMMARY.md ├── Reuest.md ├── RESTful路由.md ├── 路由.md ├── Tcp服务器.md ├── 多协议混合服务器.md ├── 模型-缓存.md ├── 关系.md ├── Rpc.md ├── 控制器.md ├── 配置.md └── curd操作.md /ws-session.md: -------------------------------------------------------------------------------- 1 | 和http一模一样 2 | ``` 3 | $this->session() 4 | ``` -------------------------------------------------------------------------------- /tcp-session.md: -------------------------------------------------------------------------------- 1 | 和http一模一样 2 | ``` 3 | $this->session() 4 | 5 | ``` -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "highlight" 4 | ] 5 | } -------------------------------------------------------------------------------- /images/screenshot_1541494181350.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lizhichao/one-doc/HEAD/images/screenshot_1541494181350.png -------------------------------------------------------------------------------- /进程间数据共享.md: -------------------------------------------------------------------------------- 1 | [globaldata](https://github.com/lizhichao/one-app/blob/master/App/GlobalData/Data.php) 2 | 所有public方法,不够可以自己添加 所有操作均为原子操作. 3 | 4 | -------------------------------------------------------------------------------- /注意事项.md: -------------------------------------------------------------------------------- 1 | 1. 请使用 one_go 代理 go 函数创建协程 2 | 2. 数据库连接池,redis连接池 如果自己 pop出一个原生pdo或者redis对象,用完记得的push回去。 3 | 通过orm模型 或者 框架提供的缓存类操作 不用自己管理连接池问题。 4 | 3. 常驻内存运行 所有的连接请使用短连接 (mysql连接 redis连接) -------------------------------------------------------------------------------- /模型-事物.md: -------------------------------------------------------------------------------- 1 | `Model::transaction(\Closure $call)` 2 | 3 | ```php 4 | 5 | User::transaction(function (){ 6 | User::where('id',3)->update(['email' => '11']); 7 | User::where('id',5)->delete(); 8 | }); 9 | 10 | ``` -------------------------------------------------------------------------------- /路由分组.md: -------------------------------------------------------------------------------- 1 | # 路由分组 2 | > Router::group(array 分组信息,\Closure 回调函数) 3 | 4 | - 分组信息是一个数字包含信息 5 | ```php 6 | [ 7 | 'prefix' => '', // 解析路径前缀 8 | 'namespace'=>'', // 命名空间前缀 9 | 'middle'=>[] // 中间件 会依次执行数组内的中间件方法 10 | ] 11 | ``` -------------------------------------------------------------------------------- /接口缓存.md: -------------------------------------------------------------------------------- 1 | # 设置缓存 2 | 3 | 设置缓存 10 秒 4 | ```php 5 | Router::group([ 6 | 'cache' => 10 7 | ], function () { 8 | Router::get('/mix/ws', HttpController::class . '@ws'); 9 | Router::get('/mix/http', HttpController::class . '@http'); 10 | }); 11 | ``` -------------------------------------------------------------------------------- /Session.md: -------------------------------------------------------------------------------- 1 | # session 对象 2 | ```php 3 | // 设置 4 | $this->session()->set('a',123); 5 | 6 | // 获取 7 | $this->session()->get('a'); 8 | 9 | // 删除 10 | $this->session()->del('a'); 11 | 12 | // 删除当前会话所有 13 | $this->session()->del(); 14 | 15 | // 获取所有的 16 | $this->session()->get(); 17 | 18 | // 获取session id 19 | $this->session()->getId(); 20 | ``` -------------------------------------------------------------------------------- /http控制器.md: -------------------------------------------------------------------------------- 1 | # http控制器 2 | 3 | http控制器需要继承`\One\Http\Controller`。 4 | `\One\Http\Controller`主要提供了如下信息 5 | 6 | ```php 7 | class HttpController extends Controller 8 | { 9 | public function index() 10 | { 11 | $code = sha1(uuid()); 12 | $this->session()->set('code', $code); 13 | // 加载模板 14 | return $this->display('index', ['code' => $code]); 15 | } 16 | } 17 | ``` 18 | -------------------------------------------------------------------------------- /介绍.md: -------------------------------------------------------------------------------- 1 | 安装项目 2 | ``` 3 | composer create-project lizhichao/one-app myapp 4 | ``` 5 | 6 | 启动项目 7 | ```shell 8 | cd myapp 9 | php App/swoole.php 10 | ``` 11 | > 停止 : `php App/swoole.php -o stop` 12 | > 重启 : `php App/swoole.php -o reload` 13 | > 守护进程启动 : `php App/swoole.php -o start` 14 | 15 | 启动成功控制台输出 16 | ``` 17 | server swoole_http_server 0.0.0.0 8081 18 | server start 19 | ``` 20 | 21 | 访问项目 22 | ```shell 23 | curl http://127.0.0.1:8081 24 | ``` 25 | -------------------------------------------------------------------------------- /路由设置别名.md: -------------------------------------------------------------------------------- 1 | # 路由设置别名 2 | ```php 3 | Router::get('/users', [ 4 | 'use' => \App\Controllers\IndexController::class . '@userList', 5 | 'as' => 'users' 6 | ]); 7 | 8 | // {id} 表示数字 9 | Router::get('/user/{id}', [ 10 | 'use' => \App\Controllers\IndexController::class . '@user', 11 | 'as' => 'user' 12 | ]); 13 | ``` 14 | 访问设置的别名 15 | ```php 16 | // 返回路径 /users 17 | router('users'); 18 | 19 | // 返回路径 /user/100 20 | router('user', ['id' => 100]); 21 | ``` -------------------------------------------------------------------------------- /Response.md: -------------------------------------------------------------------------------- 1 | # Response 相应信息给客户端的对象 2 | 通过 Response 可获取 Reuest 对象 3 | ```php 4 | $this->response->getHttpRequest() === $this->request 5 | ``` 6 | 其他常用方法 7 | 8 | ```php 9 | // 设置头部信息 10 | $this->response->header(); 11 | 12 | // 设置cookies 参数方法 同 setcookie 一直 13 | $this->response->cookie(); 14 | 15 | // session 对象 16 | $this->response->session() === $this->session() 17 | 18 | // 直接输出信息 推荐直接在控制器 return 信息; 19 | $this->response->write('hello'); 20 | ``` -------------------------------------------------------------------------------- /websocket服务器.md: -------------------------------------------------------------------------------- 1 | 主服务器 2 | ```php 3 | 4 | 'server' => [ 5 | 'server_type' => \One\Swoole\OneServer::SWOOLE_WEBSOCKET_SERVER, 6 | 'port' => 8082, 7 | 'action' => \App\Test\MixPro\Ws::class, 8 | 'mode' => SWOOLE_PROCESS, 9 | 'sock_type' => SWOOLE_SOCK_TCP, 10 | 'ip' => '0.0.0.0', 11 | 'set' => [ 12 | 'worker_num' => 5 13 | ] 14 | 15 | ] 16 | 17 | 18 | ``` 19 | 20 | 21 | 22 | 23 | 24 | ``` 25 | -------------------------------------------------------------------------------- /模型事件.md: -------------------------------------------------------------------------------- 1 | 事件主要分为前置事件before和后置事件after 2 | 3 | ```php 4 | 5 | class User extends Model 6 | { 7 | CONST TABLE = 'users'; 8 | 9 | 10 | public function onBeforeGet(EventBuild $call, $args) 11 | public function onBeforeUpdate(EventBuild $call, array $data) 12 | public function onBeforeDeletet(EventBuild $call, $args) 13 | public function onBeforeInsert(EventBuild $call, array $data) 14 | public function onAfterGet($result, $args) 15 | public function onAfterUpdate($result, $args) 16 | public function onAfterDeletet($result, $args) 17 | public function onAfterInsert($result, $args) 18 | 19 | 20 | } 21 | ~~~ 22 | 23 | ```` 24 | -------------------------------------------------------------------------------- /default.md: -------------------------------------------------------------------------------- 1 | 2 | # one 3 | 4 | One - 一个极简高性能php框架,支持[swoole | php-fpm]环境 5 | 6 | 每一个功能都足够的简单、灵活、高效。 让你在fpm下也能在`1ms`内响应请求。不需要改一行代码就可以在`swoole`和`php-fpm`之间来回切换,甚至可以共存。 7 | 8 | 9 | ## 特点: 10 | - RESTful路由 11 | - 中间件 12 | - WS/TCP……任意协议路由 13 | - ORM模型 14 | - SQL日志模板 15 | - MYSQL连接池 16 | - REDIS连接池 17 | - HTTP/TCP/WEBOSCKET/UDP服务器 18 | - 缓存 19 | - 进程间内存共享 20 | - RPC(http,tcp,udp) 21 | - 日志 22 | - TraceId调用链跟踪 23 | - Actor (Actor之间 可跨进程,跨机器通讯) 24 | 25 | ## apache/php-fpm 运行 26 | 框架支持在 `apache/php-fpm` 下运行。 27 | 28 | > 在`apache/php-fpm` 下运行不支持的功能 29 | - HTTP/TCP/WEBOSCKET/UDP服务器 30 | - 进程间内存共享 31 | - RPC(http,tcp,udp) 32 | - 各种连接池自动退化为单例模式 33 | 34 | ## one框架交流群 35 | QQ: 731475644 36 | -------------------------------------------------------------------------------- /事件.md: -------------------------------------------------------------------------------- 1 | 直接看demo吧 2 | 3 | ```php 4 | class test 5 | { 6 | private $a = 1; 7 | 8 | public function setA($a) 9 | { 10 | $this->a = $a; 11 | } 12 | } 13 | 14 | // 添加一个监听 监听test::class的event1事件 15 | Event::addListener(test::class, 'event1', function () { 16 | // 私有属性和方法这也可以使用 17 | echo $this->a . ' listen1 '. PHP_EOL; 18 | }); 19 | 20 | // 再添加一个监听 监听test::class的event1事件 21 | Event::addListener(test::class, 'event1', function () { 22 | // 私有属性和方法这也可以使用 23 | echo $this->a . ' listen2 ' . PHP_EOL; 24 | }); 25 | 26 | 27 | // 触发事件 28 | $c = new test(); 29 | $c->setA(5); 30 | Event::dispatch('event1', $c); 31 | 32 | // 触发事件 33 | $c = new test(); 34 | $c->setA(2); 35 | Event::dispatch('event1', $c); 36 | 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /swoole相关.md: -------------------------------------------------------------------------------- 1 | 主服务器 2 | ```php 3 | 4 | 'server' => [ 5 | 'server_type' => \One\Swoole\OneServer::SWOOLE_HTTP_SERVER, 6 | 'port' => 8081, 7 | 'action' => \App\Server\AppHttpServer::class, 8 | 'mode' => SWOOLE_PROCESS, 9 | 'sock_type' => SWOOLE_SOCK_TCP, 10 | 'ip' => '0.0.0.0', 11 | 'set' => [ 12 | // 'worker_num' => 10 13 | ], 14 | ] 15 | 16 | 17 | ``` 18 | 19 | 添加http监听 20 | 21 | 22 | ```php 23 | 24 | [ 25 | 'port' => 8081, 26 | 'action' => \App\Server\AppHttpPort::class, 27 | 'type' => SWOOLE_SOCK_TCP, 28 | 'ip' => '0.0.0.0', 29 | 'set' => [ 30 | 'open_http_protocol' => true, 31 | 'open_websocket_protocol' => false 32 | ] 33 | ], 34 | 35 | 36 | 37 | 38 | ``` 39 | -------------------------------------------------------------------------------- /路由中间件.md: -------------------------------------------------------------------------------- 1 | # 设置中间件 2 | ```php 3 | Router::group(['middle' => [\App\Test\MixPro\TestMiddle::class . '@checkSession']], function () { 4 | Router::get('/mix/ws', HttpController::class . '@ws'); 5 | Router::get('/mix/http', HttpController::class . '@http'); 6 | Router::post('/mix/http/loop', HttpController::class . '@httpLoop'); 7 | Router::post('/mix/http/send', HttpController::class . '@httpSend'); 8 | }); 9 | 10 | // 中间件代码 11 | class TestMiddle 12 | { 13 | public function checkSession($next, Response $response) 14 | { 15 | $name = $response->session()->get('name'); 16 | if (!$name) { 17 | return '请登录'; 18 | } 19 | return $next(); 20 | } 21 | } 22 | ``` 23 | 24 | ## 设置命名空间前缀 25 | ```php 26 | Router::group(['namespace'=>'App\\Test\\WebSocket'],function (){ 27 | Router::set('ws','/a','TestController@abc'); 28 | Router::set('ws','/b','TestController@bbb'); 29 | }); 30 | ``` -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | * [简介](default.md) 2 | * [hello world](介绍.md) 3 | * [常驻内存运行 启动\重启\停止](介绍.md) 4 | * [配置](配置.md) 5 | * [路由](路由.md) 6 | * [RESTful路由](RESTful路由.md) 7 | * [路由分组](路由分组.md) 8 | * [中间件](路由中间件.md) 9 | * [接口缓存](接口缓存.md) 10 | * [路由设置别名](路由设置别名.md) 11 | * [控制器](控制器.md) 12 | * [http控制器](http控制器.md) 13 | * [Request](Reuest.md) 14 | * [Response](Response.md) 15 | * [Session](Session.md) 16 | * [websocket控制器](websocket控制器.md) 17 | * [session](ws-session.md) 18 | * [tcp控制器](tcp控制器.md) 19 | * [session](tcp-session.md) 20 | * [模型](模型.md) 21 | * [curd操作](curd操作.md) 22 | * [模型事件](模型事件.md) 23 | * [缓存](模型-缓存.md) 24 | * [事务](模型-事物.md) 25 | * [关系](关系.md) 26 | * [缓存](缓存.md) 27 | * [日志](日志.md) 28 | * [事件](事件.md) 29 | * [http服务器](swoole相关.md) 30 | * [websocket服务器](websocket服务器.md) 31 | * [Tcp服务器](Tcp服务器.md) 32 | * [多协议混合服务器](多协议混合服务器.md) 33 | * [Rpc](Rpc.md) 34 | * [进程间数据共享](进程间数据共享.md) 35 | * [注意事项](注意事项.md) 36 | -------------------------------------------------------------------------------- /Reuest.md: -------------------------------------------------------------------------------- 1 | # Reuest 客户端请求的信息 2 | 获取 Request 对象 3 | ```php 4 | $this->request 5 | ``` 6 | `Request` 包含以下方法 7 | ```php 8 | // get信息 9 | public function get($key = null, $default = null) 10 | 11 | // post信息 12 | public function post($key = null, $default = null) 13 | 14 | // 终端下的 $argv信息 15 | public function arg($i = null, $default = null) 16 | 17 | // response 信息 = get + post 18 | public function res($key = null, $default = null) 19 | 20 | // cookie信息 21 | public function cookie($key = null, $default = null) 22 | 23 | // 请求的原生信息 php://input 24 | public function input() 25 | 26 | // 返回json信息 27 | public function json() 28 | 29 | // 返回上传的文件信息 30 | public function file() 31 | 32 | // 返回请求的方法 33 | public function method() 34 | 35 | // 是否是json格式 36 | public function isJson() 37 | public function ip() 38 | public function server($name = null, $default = null) 39 | public function userAgent() 40 | public function uri() 41 | // request id 42 | public function id() 43 | ``` -------------------------------------------------------------------------------- /RESTful路由.md: -------------------------------------------------------------------------------- 1 | # RESTful路由 2 | 3 | ```php 4 | Router::get('/', \App\Controllers\IndexController::class . '@index'); 5 | Router::post('/', \App\Controllers\IndexController::class . '@' . 'post'); 6 | Router::put('/', \App\Controllers\IndexController::class . '@' . 'put'); 7 | Router::delete('/', \App\Controllers\IndexController::class . '@' . 'delete'); 8 | Router::patch('/', \App\Controllers\IndexController::class . '@' . 'patch'); 9 | Router::head('/', \App\Controllers\IndexController::class . '@' . 'head'); 10 | Router::options('/', \App\Controllers\IndexController::class . '@' . 'options'); 11 | ``` 12 | 或者直接用 13 | ```php 14 | Router::controller('/', \App\Controllers\IndexController::class); 15 | ``` 16 | 要求`\App\Controllers\IndexController`中包含 `getAction`、`postAction`、`putAction`、`deleteAction`、`patchAction`、`headAction`、`optionsAction` 方法。 17 | 18 | 除上面方法外你可通过`set`自定义任意方法 19 | > Router::set(请求方法,请求路径,绑定执行的方法); 20 | ```php 21 | Router::set('xxx','/a','TestController@abc'); 22 | ``` 23 | 列入增加`ws`方法,设置为websocket路由。 24 | ```php 25 | Router::set('ws','/a','TestController@abc'); 26 | ``` -------------------------------------------------------------------------------- /路由.md: -------------------------------------------------------------------------------- 1 | 2 | # 路由 3 | 4 | 路由是一个非常独立模块,下面的特性可以使用在任何场景下。 5 | 如:http协议。websocket协议,tcp协议,udp协议…… 也可以无协议直接调用。 6 | 路由的路径匹配规则共4种: 7 | 8 | 1. `完全匹配` 9 | 2. `{id}` 匹配数字 10 | 3. `{name}` 匹配任意字符 11 | 4. `正则表达式` 12 | 优先级 1-4 逐渐降低。其中被`{id}`,`{name}`,`{正则表达式}`匹配的部分会作为参数传递给相应的方法。 13 | 14 | ```php 15 | //完全匹配 16 | Router::get('/', \App\Controllers\IndexController::class . '@index'); 17 | 18 | // 匹配数字 ,如: /user/1,user/223 19 | Router::get('/user/{id}', \App\Controllers\IndexController::class . '@user'); 20 | 21 | // 优先级: /user/5 会批量这条 /user/1会匹配/user/{id} 22 | Router::get('/user/5', \App\Controllers\IndexController::class . '@user5'); 23 | 24 | // 惰性匹配: 会匹配 /user/setting 25 | // /user/setting/password /user/setting/email /user/setting/xxx /user/setting/... 26 | // 只要当前匹配下面只有唯一一条路由 所有下面的path都会匹配上 path会传到相应的调用参数 27 | Router::get('/user/setting', \App\Controllers\IndexController::class . '@setting'); 28 | 29 | 30 | // 匹配任意字符,如:a/234,/a/adsfasf 31 | Router::get('/a/{name}',\App\Controllers\IndexController::class . '@aa'); 32 | 33 | 34 | // 正则表达式匹配 ,如:b/log_123 35 | Router::get('/b/`^log\_\d+$`',\App\Controllers\IndexController::class . '@bb');` 36 | ``` 37 | 38 | -------------------------------------------------------------------------------- /Tcp服务器.md: -------------------------------------------------------------------------------- 1 | 主服务器 2 | ```php 3 | 4 | 5 | 'server' => [ 6 | 'server_type' => \One\Swoole\OneServer::SWOOLE_SERVER, // 主服务器类型 7 | 'port' => 9086, 8 | 'action' => \App\GlobalData\Server::class, // 主服务器事件回调类 9 | 'mode' => SWOOLE_BASE, 10 | 'sock_type' => SWOOLE_SOCK_TCP, 11 | 'ip' => '127.0.0.1', 12 | 'pack_protocol' => \One\Protocol\Frame::class, // tcp 打包 解包协议 13 | 'set' => [ // set 相关配置 14 | 'worker_num' => 1, 15 | 'reactor_num' => 1, 16 | 'open_length_check' => 1, 17 | 'package_length_func' => '\One\Protocol\Frame::length', 18 | 'package_body_offset' => \One\Protocol\Frame::HEAD_LEN, 19 | ] 20 | ] 21 | 22 | 23 | 24 | 25 | ``` 26 | 27 | 添加tcp监听 28 | 29 | 30 | ```php 31 | 32 | [ 33 | 34 | 'port' => 8083, 35 | 'pack_protocol' => \One\Protocol\Text::class, 36 | 'action' => \App\Test\MixPro\TcpPort::class, 37 | 'type' => SWOOLE_SOCK_TCP, 38 | 'ip' => '0.0.0.0', 39 | 'set' => [ 40 | 'open_http_protocol' => false, 41 | 'open_websocket_protocol' => false 42 | ] 43 | 44 | ], 45 | 46 | 47 | 48 | 49 | ``` 50 | -------------------------------------------------------------------------------- /多协议混合服务器.md: -------------------------------------------------------------------------------- 1 | ```php 2 | 3 | ~~~ 4 | return [ 5 | 'server' => [ //ws 服务器 6 | 'server_type' => \One\Swoole\OneServer::SWOOLE_WEBSOCKET_SERVER, 7 | 'port' => 8082, 8 | 'action' => \App\Test\MixPro\Ws::class, 9 | 'mode' => SWOOLE_PROCESS, 10 | 'sock_type' => SWOOLE_SOCK_TCP, 11 | 'ip' => '0.0.0.0', 12 | 'set' => [ 13 | 'worker_num' => 5 14 | ] 15 | ], 16 | 'add_listener' => [ 17 | [ // http 服务器 18 | 'port' => 8081, 19 | 'action' => \App\Server\AppHttpPort::class, 20 | 'type' => SWOOLE_SOCK_TCP, 21 | 'ip' => '0.0.0.0', 22 | 'set' => [ 23 | 'open_http_protocol' => true, 24 | 'open_websocket_protocol' => false 25 | ] 26 | ], 27 | [ // tcp 服务器 28 | 'port' => 8083, 29 | 'pack_protocol' => \One\Protocol\Text::class, 30 | 'action' => \App\Test\MixPro\TcpPort::class, 31 | 'type' => SWOOLE_SOCK_TCP, 32 | 'ip' => '0.0.0.0', 33 | 'set' => [ 34 | 'open_http_protocol' => false, 35 | 'open_websocket_protocol' => false 36 | ] 37 | ] 38 | ] 39 | ]; 40 | 41 | ~~~ 42 | 43 | ``` -------------------------------------------------------------------------------- /模型-缓存.md: -------------------------------------------------------------------------------- 1 | ```php 2 | 3 | class User extends Model 4 | { 5 | CONST TABLE = 'users'; 6 | 7 | /** 8 | * @var int 设置缓存时间10s ,0也就是禁止缓存 9 | */ 10 | protected $_cache_time = 10; 11 | 12 | protected $_connection = 'test'; 13 | 14 | 15 | // 通过字段来设置key 避免整张表全量刷新 16 | // 如评论表 可设置 文章id字段当做 缓存key 17 | // 当评论有变化时 只会刷新当前文章的评论缓存 18 | protected $_cache_key_column = []; 19 | 20 | // 设置忽略的字段,这些字段更新时不刷新缓存 21 | protected $_ignore_flush_cache_column = []; 22 | 23 | 24 | 25 | /** 26 | * 设置关系 用户的文章 27 | * @return Model 28 | */ 29 | public function articles() 30 | { 31 | return $this->hasMany('id', Article::class, 'user_id'); 32 | 33 | // 状态为 1 的文章 34 | // return $this->hasMany('id', Article::class, 'user_id')->where('status', 1); 35 | } 36 | } 37 | ``` 38 | 39 | ```php 40 | 41 | 42 | class Article extends Model 43 | { 44 | CONST TABLE = 'articles'; 45 | 46 | // 文章浏览数量 更新时不刷新缓存 47 | protected $_ignore_flush_cache_column = ['read_count']; 48 | 49 | protected $_connection = 'test'; 50 | 51 | /** 52 | * 设置关系 用户的文章 53 | * @return Model 54 | */ 55 | public function article_tags() 56 | { 57 | return $this->hasMany('id', ArticleTag::class, 'article_id'); 58 | } 59 | 60 | } 61 | ``` 62 | -------------------------------------------------------------------------------- /关系.md: -------------------------------------------------------------------------------- 1 | 所有的关系使用方法 2 | `with(关系 funciton.name)` 3 | ## 一对一 4 | `hasOne(当前表关系字段,远端表模型,远端表字段)` 5 | 关系 `当前表关系字段 = 远端表模型.远端表字段` 6 | ```php 7 | function tag() 8 | { 9 | return $this->hasOne('tag_id',Tag::class,'id'); 10 | } 11 | ``` 12 | ## 一对多 13 | `hasMany(当前表关系字段,远端表模型,远端表字段)` 14 | 关系 `当前表关系字段 = 远端表模型.远端表字段` 15 | ```php 16 | function tag() 17 | { 18 | return $this->hasMany('tag_id',Tag::class,'id'); 19 | } 20 | ``` 21 | ## 多态一对一 22 | ```php 23 | 24 | function comment() 25 | { 26 | $this->morphOne([ 27 | 1 => Picture::calss, //当type=1时标示图片id 28 | 2 => Article::class, //当type=2 时 是文章id 29 | ],[ 30 | 1 => 'pic_id', //当type=1时 type_id = pic_id 31 | 2 => 'article_id'//当type=2 时 type_id = article_id 32 | ],'type','type_id'); 33 | } 34 | 35 | 36 | ``` 37 | ## 多态一对多 38 | 39 | ```php 40 | 41 | function comment() 42 | { 43 | $this->morphMany([ 44 | 1 => Picture::calss, //当type=1时标示图片id 45 | 2 => Article::class, //当type=2 时 是文章id 46 | ],[ 47 | 1 => 'pic_id', //当type=1时 type_id = pic_id 48 | 2 => 'article_id'//当type=2 时 type_id = article_id 49 | ],'type','type_id'); 50 | } 51 | 52 | ``` 53 | 54 | ## 多对一 55 | 56 | 关系HasIn, 在场景 A表字段af保存的B表的id,id这种格式的时候适用 57 | 58 | ```php 59 | // 定义关系 60 | public function Binfo() 61 | { 62 | return $this->hasIn('af',BModel::class,'id'); 63 | } 64 | 65 | // 使用关系 66 | A::limit(10)->with('Binfo')->findAll(); 67 | ``` 68 | -------------------------------------------------------------------------------- /Rpc.md: -------------------------------------------------------------------------------- 1 | ## 配置服务 2 | ```php 3 | // http 协议 rpc服务 4 | [ 5 | 'port' => 8082, 6 | 'action' => \App\Server\RpcHttpPort::class, 7 | 'type' => SWOOLE_SOCK_TCP, 8 | 'ip' => '0.0.0.0', 9 | 'set' => [ 10 | 'open_http_protocol' => true, 11 | 'open_websocket_protocol' => false 12 | ] 13 | ], 14 | // tpc 协议 rpc服务 15 | [ 16 | 'port' => 8083, 17 | 'action' => \App\Server\RpcTcpPort::class, 18 | 'type' => SWOOLE_SOCK_TCP, 19 | 'pack_protocol' => \One\Protocol\Frame::class, // tcp 打包 解包协议 20 | 'ip' => '0.0.0.0', 21 | 'set' => [ 22 | 'open_http_protocol' => false, 23 | 'open_websocket_protocol' => false, 24 | 'open_length_check' => 1, 25 | 'package_length_func' => '\One\Protocol\Frame::length', 26 | 'package_body_offset' => \One\Protocol\Frame::HEAD_LEN, 27 | ] 28 | ] 29 | ``` 30 | 31 | ## 添加服务 32 | 33 | ```php 34 | 35 | // 添加Abc到rpc服务 36 | RpcServer::add(Abc::class); 37 | 38 | // 如果你不希望把Abc下的所有方法都添加到rpc服务,也可以指定添加。 39 | // 未指定的方法客户端无法调用. 40 | //RpcServer::add(Abc::class,'add'); 41 | 42 | // 分组添加 43 | //RpcServer::group([ 44 | // // 中间件 在这里可以做 权限验证 数据加解密 等等 45 | // 'middle' => [ 46 | // TestMiddle::class . '@aa' 47 | // ], 48 | // // 缓存 如果设置了 当以同样的参数调用时 会返回缓存信息 不会真正调用 单位:秒 49 | // 'cache' => 10 50 | //], function () { 51 | // RpcServer::add(Abc::class); 52 | // RpcServer::add(User::class); 53 | //}); 54 | 55 | ``` 56 | 57 | 58 | ### 客户端调用 59 | ```php 60 | // 映射类 one框架会自送生成 访问http服务 http://127.0.0.1:8082/ 下载 61 | class ClientAbc extends RpcClientHttp { 62 | 63 | // rpc服务器地址 64 | protected $_rpc_server = 'http://127.0.0.1:8082/'; 65 | 66 | // 远程的类 不设置 默认为当前类名 67 | protected $_remote_class_name = 'Abc'; 68 | } 69 | 70 | $abc = new ClientAbc(5); 71 | // $res === 10 72 | $res = $abc->add(2,3); 73 | // 链式调用 $res === 105 74 | $res = $abc->setA(100)->add(2,3); 75 | 76 | ``` 77 | 78 | 如果是tcp请继承 RpcClientTcp 79 | 代码地址 [RpcClientTcp ](https://github.com/lizhichao/one/blob/master/src/Swoole/RpcClientTcp.php), [RpcClientHttp](https://github.com/lizhichao/one/blob/master/src/Swoole/RpcClientHttp.php) 80 | 81 | 如果在one框架内tcp调用 请继承 [RpcTcp](https://github.com/lizhichao/one-app/blob/master/App/Client/RpcTcp.php)支持协程 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /控制器.md: -------------------------------------------------------------------------------- 1 | # 控制器 2 | 控制器正式处理业务逻辑的开始。权限验证、数据加解密等和业务逻辑无关的逻辑大部分可以由中间件来处理。 3 | [TOC] 4 | 5 | ## http控制器 6 | 7 | http控制器需要继承`\One\Http\Controller` 8 | 9 | ### Request 客户端请求的信息 10 | 获取 Request 对象 11 | ```php 12 | $this->request 13 | ``` 14 | `Request` 包含以下方法 15 | ```php 16 | // get信息 17 | public function get($key = null, $default = null) 18 | 19 | // post信息 20 | public function post($key = null, $default = null) 21 | 22 | // 终端下的 $argv信息 23 | public function arg($i = null, $default = null) 24 | 25 | // response 信息 = get + post 26 | public function res($key = null, $default = null) 27 | 28 | // cookie信息 29 | public function cookie($key = null, $default = null) 30 | 31 | // 请求的原生信息 php://input 32 | public function input() 33 | 34 | // 返回json信息 35 | public function json() 36 | 37 | // 返回上传的文件信息 38 | public function file() 39 | 40 | // 返回请求的方法 41 | public function method() 42 | 43 | // 是否是json格式 44 | public function isJson() 45 | public function ip() 46 | public function server($name = null, $default = null) 47 | public function userAgent() 48 | public function uri() 49 | // request id 50 | public function id() 51 | ``` 52 | 53 | 如下属性 54 | ```php 55 | // 连接表示 在swoole下可用 56 | public $fd = 0; 57 | // url地址栏参数 58 | public $args = []; 59 | // 执行的calss 60 | public $class = ''; 61 | // 执行的方法名称 62 | public $method = ''; 63 | ``` 64 | 65 | ### Response 相应信息给客户端的对象 66 | 通过 Response 可获取 Reuest 对象 67 | ```php 68 | $this->response->getHttpRequest() === $this->request 69 | ``` 70 | 其他常用方法 71 | 72 | ```php 73 | // 设置头部信息 74 | $this->response->header(); 75 | 76 | // 设置cookies 参数方法 同 setcookie 一直 77 | $this->response->cookie(); 78 | 79 | // session 对象 80 | $this->response->session() === $this->session() 81 | 82 | // 直接输出信息 推荐直接在控制器 return 信息; 83 | $this->response->write('hello'); 84 | ``` 85 | ### session 对象 86 | ```php 87 | // 设置 88 | $this->session()->set('a',123); 89 | 90 | // 获取 91 | $this->session()->get('a'); 92 | 93 | // 删除 94 | $this->session()->del('a'); 95 | 96 | // 获取所有的 97 | $this->session()->get(); 98 | 99 | // 获取session id 100 | $this->session()->getId(); 101 | ``` 102 | 103 | ## websocket 控制器 104 | 105 | ## tcp 控制器 -------------------------------------------------------------------------------- /配置.md: -------------------------------------------------------------------------------- 1 | # 配置 2 | 配置文件在`Config`目录下 3 | 通过函数`config($file_name)` 加载 4 | 整个项目初始化配置加载 `config.php` 5 | ```php 6 | _APP_PATH_ . '/Config/router.php']); 10 | \One\Cache\File::setConfig(config('cache.file')); 11 | \One\Cache\Redis::setConfig(config('cache.redis')); 12 | \One\Crypt\Openssl::setConfig(config('crypt')); 13 | // 若有其他加载 下面补充 14 | ``` 15 | ## 项目路径信息 16 | ``` 17 | ├── Config 配置 18 | │   ├── cache.php 缓存配置 19 | │   ├── crypt.php 加解密配置 20 | │   ├── global_data.php 共享缓存配置 21 | │   ├── log.php 日志配置 22 | │   ├── mysql.php 数据库配置 23 | │   ├── protocol.php http/tcp/udp/websocket服务器配置 24 | │   ├── router.php 路由配置 25 | │   ├── rpc.php rpc配置 26 | │   ├── session.php session 配置 27 | ├── config.php 加载配置 28 | ├── Controllers 控制器路径 (你也可以自定义支持prs4任意路径) 29 | ├── Exceptions 异常处理 30 | │   └── Handler.php 31 | ├── GlobalData 共享缓存 32 | │   ├── Client.php 共享客户端 33 | │   ├── Data.php 共享数据处理 34 | │   └── Server.php 共享服务器 35 | ├── index.php 起始文件 36 | ├── Model 模型 37 | │   └── User.php 38 | ├── public web root 39 | │   └── index.php 40 | php-fpm入口文件 41 | ├── RunCache 运行临时文件 需要读写权限 42 | │   ├── cache 43 | │   └── log 44 | ├── Server 可供选择的服务器 (你也可以自己建一个) 45 | │   ├── AppHttpPort.php http监听 46 | │   ├── AppHttpServer.php http服务 47 | │   ├── AppTcpPort.php tcp监听 48 | │   ├── AppTcpServer.php tcp服务 49 | │   ├── AppWsServer.php websocket服务 50 | │   ├── RpcHttpPort.php rpc http 监听 51 | │   ├── RpcHttpServer.php rpc http服务 52 | │   ├── RpcTcpPort.php rpc tcp 监听 53 | │   ├── RpcTcpServer.php rpc tcp 服务 54 | │   ├── RpcTrait.php 55 | │   └── RpcWsServer.php rpc ws 服务 56 | ├── shell.php 57 | shell入口文件 58 | ├── swoole.php 基于swoole起始文件 59 | └── View 模板目录 60 | ``` 61 | 62 | ## 程序入口 63 | 64 | swoole 启动 `php swoole.php` 65 | php-fpm入口文件 `public/index.php` 66 | shell入口文件 `shell.php` 67 | 68 | shell 请求规则 69 | `php shell.php get/abc` 等价于访问 `curl http://you_domain/abc` 70 | 71 | `php shell.php 请求方法/请求路径` 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /curd操作.md: -------------------------------------------------------------------------------- 1 | # 模型操作 2 | 3 | 通过模型操作数据库,在swoole下自动切换为连接池。在fpm下自动为单列。 4 | 5 | 插入一条数据 6 | 7 | ```php 8 | 9 | $id = User::insert([ 10 | 'name' => $key, 11 | 'email' => 'name@aa.com', 12 | ]); 13 | 14 | ``` 15 | 16 | 迭代用户所有的数据 17 | ```php 18 | $rs = User::chunk(); 19 | foreach($rs as $user){ 20 | 21 | } 22 | ``` 23 | 24 | 迭代和关系组合使用 25 | ```php 26 | User::where('id', '>', 100) 27 | ->where('status', '>', 1) 28 | ->with('category') 29 | ->with('article', [ 30 | function ($q) { 31 | $q->with('tags.tag')->with('commmit.user'); 32 | } 33 | ]) 34 | ->chunk(); 35 | ``` 36 | 37 | 38 | 插入多条数据 39 | 40 | ```php 41 | 42 | $ar = []; 43 | for ($i = 0; $i < 100; $i++) { 44 | $ar[] = [ 45 | 'name' => 'name' . $i, 46 | 'email' => 'name' . $i . '@aa.com', 47 | 'age' => rand(10, 70) 48 | ]; 49 | } 50 | User::insert($ar, true); 51 | 52 | ``` 53 | 54 | 更新数据 55 | 56 | ```php 57 | 58 | // 先查询后更新 累加 59 | $one = User::find(10); 60 | $row = $one->update(['name' => 'name3s', 'age' => ['age+1']]); // 条件是主键 61 | echo $row . PHP_EOL; // 影响行数 62 | //update users set name='name3s',age=age+1 where id='10' 63 | 64 | // 批量更新 65 | $row = User::whereIn('id', [6, 7, 8])->update(['email' => 1423]); 66 | echo $row . PHP_EOL; 67 | // update users set email='123' where id in ('6','7','8') 68 | 69 | // 查询出来的对象可以直接调用update 70 | $arr = User::where('id', '>', '20')->orderBy('id asc')->limit(3)->findAll(); 71 | foreach ($arr as $v) { 72 | $v->update(['age' => 19]); // 条件是主键 73 | } 74 | 75 | 76 | ``` 77 | 78 | 删除 79 | 80 | ```php 81 | 82 | $row = User::whereIn('id', [61, 71, 81])->delete(); 83 | echo $row . PHP_EOL;// 影响行数 84 | $one = User::find(66); 85 | $row = $one->delete(); // 条件是主键 86 | echo $row . PHP_EOL; 87 | 88 | 89 | ``` 90 | 91 | 92 | 查询 93 | 94 | ```php 95 | 96 | // with 可无限级数关联下去 97 | 98 | $arr = User::with('articles.article_tags.tag')->limit(10)->findAll()->toArray(); 99 | 100 | ``` 101 | 102 | 关联查询 103 | 104 | ```php 105 | // select * from users left join articles on users.id=articles.user_id where users.id>1 106 | $arr = User::where('users.id', '>', '1')->leftJoin('articles', 'users.id', 'articles.user_id')->findAll()->toArray(); 107 | 108 | // select * from users left join articles on users.id=articles.user_id and articles.read_count>2 where users.id>1 109 | $arr = User::where('users.id', '>', '1')->leftJoin('articles', function (Join $q) { 110 | $q->on('users.id', 'articles.user_id')->where('articles.read_count', '>', 2); 111 | })->findAll()->toArray(); 112 | 113 | ``` 114 | --------------------------------------------------------------------------------