后端 - 后台开发文档
1、环境要求
操作系统:Windows/Linux
PHP:7.0+
MySql:5.5+
2、MVC流程调整
初衷,由于传统的MVC模式,Controller
层,常用于业务处理,但单个Action
对应一条路由,文件管理方面太难维护了,而且协同开发时,当遇到多人同改一个Controller
的时候对版本审计的工作又加大了审核量。
为了应对一系列的问题,所以对ThinkPHP5.1的加载流程,在对原核心包不修改的前提下,做了一些调整。
控制器加载流程改动如果:
A、参考admin分组下的控制器加载流程
B、主要改动为,原来的操作方法扩展为一个独立的控制器,并返回固定方法run()
,让其继承的_Admin
父类控制器加载,若不存在则定义到404
C、可能会有人说那这样原来的控制器负责干嘛?主要可以用于做一些前置后置操作绑定,或者绑定公共的中间件等,具体参考控制器的代码。
上面说的可能不太好理解,我们来单独看看文件目录:
若要深入了解的朋友,打开这几个文件查看下就清楚了,代码量很少的。
3、后台权限架构说明
后台权限使用的是传统的AUTH
权限控制模块,另加入了管理员账号可独立配置权限。
在模板文件中,使用下列方式即可判断权限显示对应的菜单:
{if ($auth->vif('控制器','方法')) } 逻辑体 {/if}
4、数据库管理v1.0.6
出于安全考虑,当前系统后台只支持数据库表详情查看
功能
5、CMD工具命令扩展v1.0.3
我们需要在后台/Cmd/index.php
控制器的run()
方法中先加入对应的指令分流处理,
然后再将对应的指令封装到/extend/cmd/
文件夹中,规范为一组指令为一个文件,该文件需要继承Common.php
基类。
self::json('02', '内容');
表示返回单条记录。
$data[] = '第一条';
$data[] = '第二条';
self::json('00', $data);
表示返回多条记录。
6、分表操作v1.0.2
注意:v1.0.6
后的版本,才支持切库操作。
分表的前提,假设我们需要对order_log
表进行分表存储,我们需要先创建一个order_log
空表,架构会自动按主键求余,并复制该表结构,生成新表。
分表基于\org\SubTable()
类
分表写入例子:
有时候我们需要跨库处理分表业务,再需要切表处理Db,这时候我们需要这样使用
分表后合表查询例子(不建议这样的业务,合表始终性能都不高):
7、前台接口API文档生成v1.0.5
架构的API文档生成类依赖规范的注释风格。
文档位置:根域名/apiword/
文档初始化配置:/apiword/index.php
,打开该文件修改其中的登陆密码 跟 所需要生成文档的控制器对应分组。
文档生成格式,参考/app/api/controller/1-接口类基础模板/
下的控制器模板文件即可。
注意:对未定义_link()
方法的控制器,文档中会标记为【待完成】状态
8、Laf日志挂载v1.0.6
Laf日志挂载基于\log\Log()
类。
生成的日志文件,可以在后台的【系统设置】->【应用日志】中查看,日志名称为【分组_控制器_方法_时_分_秒_三位随机数.log】的文件保存。
Laf日志挂载使用单例模式实现,可在应用的任意位置挂载LOG写入,当挂载Laf日志的同时,会接手Think的日志异常处理,当挂载点发生错误时会自动捕捉异常并写入Log,每一个应用请求,为一整条Laf日志。
Laf日志的错误级别主要有:
Laf日志挂载例子:
9、Swoole秒级定时器管理v1.0.4
定时器任务 可以 在后台的【系统设置】-> 【定时任务】中管理。
每一次修改完定时器任务后,都需要kill
掉原来的swoole进程,然后再进入cd /crontab
中,重新nohup php vendor/task.php >>/dev/null 2>&1 &
一下重启脚本
10、IP地址省市区查询v1.0.7
该接口主要以抓取第三方IP实现。具体使用案例如下:
11、身份证信息查询v1.0.7
该接口主要以CURL爬虫实现,依赖\org\Idcard::run(身份证号)
方法支持。查询失败返回false
,成功返回一维数组。具体使用案例如下:
12、手机|固话 归属地查询v1.0.7
该接口主要以CURL爬虫实现,依赖\org\Phone::run(手机号)
方法支持。查询失败返回false
,成功返回一维数组。具体使用案例如下:
0、微信相关配置v1.0.8
微信相关配置在/config/wx.php
文件中管理,类包存放在/extend/wx/
目录下。
微信相关的类包,内部统一实现了日志挂载,调试的过程中可以在后台直接查看日志。
1、TOKEN验证v1.0.8
直接调用\wx\sdk\check_token::run();
即可
2、消息回复v1.0.8
先修改配置文件,再调用该类,该类是一套使用流程,demo如下:
\wx\sdk\message_reply::xml();
:抓取xml信息,并自动实现解密。
\wx\sdk\message_reply::send($resultStr);
:输出xml给微信,并自动实现加密。
3、获取access_tokenv1.0.8
直接调用\wx\sdk\access_token::get();
即可,成功返回access_token。
4、菜单相关v1.0.8
参考下列demo:
5、消息模板发送v1.0.8
参考下列demo:
6、获取登录授权地址v1.0.8
参考下列demo:
7、静默授权获取用户信息流程v1.0.8
参考下列demo:
8、点击授权获取用户信息流程v1.0.8
参考下列demo:
9、长连接转短连接v1.0.8
参考下列demo:
10、生成二维码v1.0.8
参考下列demo:
11、小程序-JSAPI支付v1.0.8
失败返回false
,成功返回具体参数,调用方式参考下列demo:
12、H5支付v1.0.8
失败返回false
,成功返回具体参数,调用方式参考下列demo:
13、二维码支付v1.0.8
失败返回false
,成功返回具体参数,调用方式参考下列demo:
1、Swoole版本要求v1.0.9
长连接服务器是基于Swoole 4.2.8
研发完成。
注意:Swoole的版本差异比较大,尽量安装4.2.8
版本进行部署。
从v1.0.11
版本后起,支持Swoole 4.4.18
版本。
从v1.0.13
版本后起,支持Swoole 4.5.0
版本。
2、目录架构v1.0.10
(以下目录结构只对应最新版本):
可根据自身不同的业务场景,修改其代码。
3、配置介绍v1.0.9
WebSocket的配置文件,依旧统一使用/config/laf.php
文件存储,其配置结构如下(以下配置只为最新版本):
其中需要注意以下几点:
websocket_aes_key
:填入时,则自动启用数据传输加解密。
websocket_api_key
:为外部接口的api_key请求密钥,且外部接口是不带数据加解密传输的
websocket_api_headers
:该参数末尾的,api_key
是不允许删除的
websocket_api_process_name
:为Swoole的进程别名,如果你修改了该参数,那么/app/socket/controller/reload.sh
脚本里的别名也需要改下。
websocket_crt_path
:当填入该参数时,Swoole的启动方式改为使用SSL
证书
4、启动服务v1.0.9
5、平滑重启v1.0.9
对于一些24小时都有业务量的应用,是没办法在线上环境中kill
进程,然后再重启Swoole的,因为这样会造成不可估量的脏数据。
为了应对这种场景,Swoole中提供了一系列的kill
命令,用于平滑的关闭进程,并自动重启。
phplaf-websocket的平滑重启脚本,存放在/app/socket/controller/reload.sh
文件中。
我们只需要在linux中,执行sh /绝对路径/reload.sh
即可平滑重启WebSocket。
6、开发说明v1.0.9
实际开发中,我们要使用phplaf-weboscket,则需要自己手动修改逻辑代码,其中包括(以下文件,都是相对/app/socket/controller/
目录下的文件):
Go.php
:长连接启动入口,需要修改里面的内存表结构,为自身业务逻辑的用户表结构。
/event/onTimer.php
:心跳重连群发信息,需要修改里面的Db查询为自身业务。
/action/heartbeat.php
:心跳重连接口,检查下是否需要修改里面的redis字段信息。
/action/login.php
:登录接口,修改里面的Db业务,和内存表,redis表存储结构为自身业务。
/action/logout.php
:退出接口,修改里面的Db查询为自身业务。
还有一点需要极其注意:
Swoole严禁在服务代码,定义静态成员,又或者全局变量,例如:
static $成员属性;
global $e;
之类的,因为这样有可能造成严重的内存泄露。
而且最好也不要写创建静态类,因为静态类是常驻内存的,如果你调用之后没手动释放内存,那就会一直占用。
如果要存储这些全局的数据,可以使用内置的redis连接替代。使用方法为:$ws->redis
(v1.0.13
版本后,改为Redis连接池)
7、生命周期v1.0.10
phplaf-websocket的生命周期流程主要如下(以下流程只对应最新版本):
其中有几点需要特别注意:
1、当第一次启动服务时,会触发onStart
和onWorkerStart
事件,但当我们执行reload.sh
平滑重启脚本时,只会单独执行一次onWorkerStart
事件。
2、直接kill
掉服务进程是无法触发onShutdown
事件的,只能通过kill -15 进程PID
的方式关闭进程,才能触发该事件。
3、平滑重启也无法重新载入定时器,需要真正退出进程,重新重启服务。
4、平滑重启会重载连接池。
5.事件中是,默认不清空redis的连接池,如果有需要,修改该事件里的代码自行开启.
8、交互流程v1.0.9
对于客户端而言,phplaf-websocket长连接与正常的长连接交互方式一样,生命周期消息事件也一致。
唯一要主要的是,phplaf在数据包中使用action
字段做为接口名称,而有的人喜欢使用code
状态码来做请求区分。
个人觉得使用action
有利于接口区分和消息转发,更便于架构管理和代码维护。
还有一点就是phplaf可以在配置文件中无缝切换是否使用消息加解密,在实际开发中,可能测试阶段不加密,线上阶段则开启加密,所以客户端应对这种场景下,可能也得做下切换兼容。
9、服务端接口v1.0.9
服务端接口是相对于客户端而言所请求的数据包,其数据结构主要为:
服务端接口统一存放在/app/socket/controller/action/
目录下,以一个文件为一个接口所定义。
接口的回调通知,需要使用/app/socket/controller/callback/
(v1.0.13
版本后改为短命名空间/callback/
)目录下的回调类,其类名为回调事件的action
参数。
例如下面的一个test
接口:(v1.0.11
版本前为静态方法)
其中,run()
方法的接收参数名称与个数是固定的,不允许改变。
_link()
方法是秉承api接口文档
的理念,当定义该方法后,在websocket
文档中会标记为已完成。
10、服务端回调v1.0.9
服务端回调,是相当于客户端所收到的数据报,其数据结构主要为:
服务端回调类统一存放在/app/socket/controller/callback/
(v1.0.13
版本后改为短命名空间/callback/
)目录下,以一个文件为一个回调事件所定义。
其类名为回调事件的action
参数。
例如下面内置的success
回调事件:
其中,run()
方法的接收参数名称与个数是固定的,不允许改变。
_link()
方法是秉承api接口文档
的理念,当定义该方法后,在websocket
文档中会标记为已完成。
注意其注释规范,文档依赖注释生成。
11、外部接口v1.0.9
外部接口用于通过HTTP的方式调用,进而干扰处理WebSocket内的业务,也可俗称第三方推送请求。
phplaf-websocket的外部接口在请求时需要在headers带入api_key
密钥参数,否则无法请求。
其接口返回值结构如下:
外部接口类统一存放在/app/socket/controller/api/
目录下,以路由文件对应方式所定义。
例如,我们定义一条路由为/shop/insert
的请求,那么就需要创建一个/app/socket/controller/api/shop/insert.php
文件。
如果,只定义一条路由为/login
的请求,那么就需要创建一个/app/socket/controller/api/login.php
文件。
下面我们参考一条路由为/test
的请求,(v1.0.11
版本前为静态方法):
其中,run()
方法的接收参数名称与个数是固定的,不允许改变。
_link()
方法是秉承api接口文档
的理念,当定义该方法后,在websocket
文档中会标记为已完成。
注意其注释规范,文档依赖注释生成。
同时需要注意,接口返回消息只能通过$response->class->endRequest()
方法调用。
而且逻辑中不能带有echo
等输出语句。也不能进行任何exit
断点调试。
否则服务器将报错,产生不可预估的错误。
12、文档生成v1.0.9
phplaf-websocket的文档生成类依赖规范的注释风格。
文档位置:根域名/socketword/
文档初始化配置:/socketword/index.php
,打开该文件修改其中的登陆密码 跟 所需要生成文档的控制器对应分组。
文档生成格式,参考/app/socket/controller/
下的action
、api
、callback
三个目录下的代码风格即可。
注意:对未定义_link()
方法的类,文档中会标记为【待完成】状态
文档对WebSocket的调试器只支持明文模式下的调试,所以开发阶段建议使用明文模式这样更方便调试。
同时需要注意:
因为websocket的外部接口,常带端口号的,调试器一般都会报跨域拦截。
默认情况下/config/laf.php
对跨域请求是开放的*
权限,可根据业务自行调整。
13、定时任务v1.0.10
phplaf的定时器统一存放在/app/socket/controller/crontab/
目录下,以一个Class文件为一个定时脚本。
所有任务将会在onMessage
事件中被统一加载。(原v1.0.11
版本之前是onStart
事件是错误的,官方不允许)
注意:定时器载入后会被平滑重启机制影响,平滑重启后,原定时任务会被中断,需要由onMessage
事件重新载入定时器。
每个定时任务都需要创建run()
方法为启动入口,并接收固定的参数,例子如下(v1.0.11
版本前为静态方法):
14、日志挂载v1.0.10
由于长连接与MVC不一样,在请求过程中没有URL的概念,所以也就不存在一个请求为一个事件的概念。维持原来架构中的\log\Log
日志挂载类就不能正确使用了。
为了记录长连接的日志,phplaf提供了一个独立的日志挂载类,\log\Slog
,以每日为日志挂载点,日志名称为websocket.log
。
日志开关、存放方式和预览还是依照\log\Log
不过日志的调用方法有些不同(加多了一个$ws
),参数如下:
1、初始化说明v1.0.12
SQL语句构造器,主要用于傻瓜式生成SQL语句,方便在WebSocket中使用数据库连接池执行SQL。
SQL语句构造器,使用单例模式实现。
调用语法为:\db\SwooleDb::run()->后续操作();
起链式操作语法与ThinkPHP5.1
Db类一致。
2、tablev1.0.12
table(表名)
:选择操作表。
SQL语句构造器,表前缀使用/config/database.php
配置类里的,prefix
字段。
所以我们使用table()
链的时候不需要带表前缀。其使用demo如下:
$sql = \db\SooleDb::run()->table('user');
3、aliasv1.0.12
alias(别名)
:用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。
示例:
\db\SooleDb::run()->table('user')->alias('A');
最终生成的SQL语句类似于:
FROM tp_user AS A;
4、wherev1.0.12
where()
:用于构造SQL执行条件,该语法实现了三种场景支持,并没有完全实现ThinkjPHP5.1的where
语法。
场景一:多条件数组查询
最终生成的SQL语句类似于:
FROM tp_user WHERE id <> 1 AND money >= 100 AND name like '%小黄牛%';
场景二:多条件多链查询
最终生成的SQL语句类似于:
FROM tp_user WHERE id <> 1 AND money >= 100 AND name like '%小黄牛%';
场景三:便捷等于查询
$sql = \db\SwooleDb::run()->table('user')->where('id' , 1)->where('name', '小黄牛');
最终生成的SQL语句类似于:
FROM tp_user WHERE id=1 AND name='小黄牛';
最后注意:where()
链在一条SQL语句中是可以多次使用的,其执行顺序是先进先执行,相同的语句并不会覆盖,所以使用的时候需要自己注意下。
5、fieldv1.0.12
field()
:方法主要作用是标识要返回或者操作的字段,可以用于查询和写入操作。
示例:
\db\SooleDb::run()->table('user')->field('id, name');
最终生成的SQL语句类似于:
id,name FROM tp_user;
注意:如果不使用field()
链执行查询
操作,默认是*
符号。
6、limitv1.0.12
limit()
:方法主要用于指定查询和操作的数量。
示例:
\db\SooleDb::run()->table('user')->limit(10, 20);
最终生成的SQL语句类似于:
FROM tp_user limit 10,20;
也可以这样调用:
\db\SooleDb::run()->table('user')->limit(10);
最终生成的SQL语句类似于:
FROM tp_user limit 10;
7、pagev1.0.12
page()
:方法主要用于分页查询。最终生成的语法也是limit结构。
示例:
\db\SooleDb::run()->table('user')->page(1, 10);
最终生成的SQL语句类似于:
FROM tp_user limit 0, 10;
之后的页数是这样:
\db\SooleDb::run()->table('user')->page(2, 10);
最终生成的SQL语句类似于:
FROM tp_user limit 10, 10;
8、orderv1.0.12
order()
:方法用于对操作的结果排序或者优先级限制。
示例:
\db\SooleDb::run()->table('user')->order('id DESC, money ASC');
最终生成的SQL语句类似于:
FROM tp_user ORDER BY id DESC, money ASC;
9、havingv1.0.12
having()
:方法用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。
示例:
\db\SooleDb::run()->table('user')->having('count(id)>3');
最终生成的SQL语句类似于:
FROM tp_user HAVING count(id)>3;
10、groupv1.0.12
group()
:方法通常用于结合合计函数,根据一个或多个列对结果集进行分组 。
group()
方法只有一个参数,并且只能使用字符串。
示例:
\db\SooleDb::run()->table('user')->group('id');
最终生成的SQL语句类似于:
FROM tp_user GROUP BY id;
11、joinv1.0.12
join()
:方法用于根据两个或多个表中的列之间的关系,从这些表中查询数据。join通常有下面几种类型,不同类型的join操作会影响返回的数。
INNER JOIN: 等同于 JOIN(默认的JOIN类型)
,如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
同时注意:join
语法中的表名不需要带表前缀,Class会自动读取配置文件中的前缀设置。
示例:
\db\SooleDb::run()->tabletp_user_data('user')->alias('A')->join('user_data B', 'A.id=B.user_id');
最终生成的SQL语句类似于:
FROM tp_user AS A LEFT JOIN tp_user_data AS B ON A.id=B.user_id;
我们也可以自己指定JOIN方式:
\db\SooleDb::run()->tabletp_user_data('user')->alias('A')->join('user_data B', 'A.id=B.user_id', 'inner');
最终生成的SQL语句类似于:
FROM tp_user AS A INNER JOIN tp_user_data AS B ON A.id=B.user_id;
注意:join
链可以多个使用,顺序是先用先执行。
12、selectv1.0.12
select()
:是链式操作的终结方法之一,该链支持上述11种查询表达式,主要用于查询多条记录。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->field('id')->where('id', 1)->order('id DESC')->select();
最终生成的SQL语句类似于:
SELECR id FROM tp_user where id=1 ORDER BY id DESC;
更多的链式组合可以自己尝试下。
13、findv1.0.12
find()
:是链式操作的终结方法之一,该链支持上述9种查询表达式,主要用于查询一条记录。主要不支持limit
、page
链。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->field('id')->where('id', 1)->order('id DESC')->find();
最终生成的SQL语句类似于:
SELECR id FROM tp_user where id=1 ORDER BY id DESC limit 1;
更多的链式组合可以自己尝试下。
14、deletev1.0.12
delete()
:是链式操作的终结方法之一,用于构造删除语句,该链只支持4种查询表达式,分别为:table
、where
、order
、limit
。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->where('id', 1)->order('id DESC')->delete();
最终生成的SQL语句类似于:
DELETE FROM tp_user where id=1 ORDER BY id DESC;
更多的链式组合可以自己尝试下。
15、updatev1.0.12
update()
:是链式操作的终结方法之一,用于构造单条记录更新语句,该链只支持2种查询表达式,分别为:table
、where
。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->where('id', 1)->update(['name' => '小黄牛', 'money' => 100]);
最终生成的SQL语句类似于:
UPDATE tp_user SET name='小黄牛',money=100 where id=1;
16、insertv1.0.12
insert()
:是链式操作的终结方法之一,用于构造单条 或 多条记录新增语句,该链只支持1种查询表达式,为:table
。
该方法调用后会返回最终构造成的SQL语句。
单条新增示例:
\db\SooleDb::run()->table('user')->insert(['name' => '小黄牛', 'money' => 100]);
最终生成的SQL语句类似于:
INSERT INTO tp_user (name,money) VALUES ('小黄牛',100);
多条新增示例:
最终生成的SQL语句类似于:
INSERT INTO tp_user (name,money) VALUES ('小蓝牛',50),('小红牛',70),('小黄牛',100);
注意:当使用批量新增时,所有的插入数据结构顺序需要与第一条数据顺序一致,否则将会出错,例如下拉语句就是错误的:
17、setIncv1.0.12
setInc()
:是链式操作的终结方法之一,用于构造自增语句,该链只支持2种查询表达式,分别为:table
、where
。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->where('id', 1)->setInc('money', 20);
最终生成的SQL语句类似于:
UPDATE tp_user SET money=money+20 where id=1;
如果我们不填自增数,默认会是1
:
\db\SooleDb::run()->table('user')->where('id', 1)->setInc('money');
最终生成的SQL语句类似于:
UPDATE tp_user SET money=money+1 where id=1;
18、setDecv1.0.12
setDec()
:是链式操作的终结方法之一,用于构造自减语句,该链只支持2种查询表达式,分别为:table
、where
。
该方法调用后会返回最终构造成的SQL语句。
示例:
\db\SooleDb::run()->table('user')->where('id', 1)->setDec('money', 20);
最终生成的SQL语句类似于:
UPDATE tp_user SET money=money-20 where id=1;
如果我们不填自减数,默认会是1
:
\db\SooleDb::run()->table('user')->where('id', 1)->setDec('money');
最终生成的SQL语句类似于:
UPDATE tp_user SET money=money-1 where id=1;
1、连接池说明v1.0.12
WebScoket的数据库连接池是使用的Swoole\Coroutine\Channel
+Swoole\Coroutine\MySQL
实现。
支持协程操作,但如果不熟悉协程的朋友,一次只需要获取一个连接进行操作即可,这样就不用担心存在协程切换导致出现BUG的问题。
PHPLAF数据连接池强制进行读写分离操作,如果你不需要读写分离,只需要将两份数据库配置设置成一致的即可。
数据连接池,配置文件路径:/config/laf.php
数据连接池,的链接生成是使用的for
求余生成,按顺序平均读取配置项建立链接。
数据连接池的启动和空闲检测在onWorkerStart
事件中。
如果关服需要清空连接池,可在onShutdown
事件中自行实现。(v1.0.13
版本后系统已默认清空。)
连接池只提供了数据库连接的维护工作,构造SQL的相关语句可以用\db\SwooleDb
类实现。
SQL语句的执行可以参考Swoole官方语法:https://wiki.swoole.com/#/coroutine_client/mysql?id=%e6%96%b9%e6%b3%95
2、执行SQL流程v1.0.12
数据库连接池使用 单例模式 实现,其类调用方法为:\app\socket\controller\vendor\pool\MysqlPool::run()->操作方法();
(v1.0.13
版本后,改用短命名空间调用:\pool\MysqlPool::run()->操作方法();
)
连接池的使用流程大致为:
1、根据读\写业务,从不同的连接池中取出一个连接
2、取出DB实例
3、构造SQL语句
4、执行SQL语句
5、归回连接到连接池
下面我们来看个实例:
3、事务支持v1.0.12
连接池中执行SQL语句是依赖Swoole\Coroutine\MySQL
实例,所以事务的调用与支持也是参考Swoole
官方的使用说明,
下面我们来看个小案例就明白了:
4、常用方法v1.0.12
通过上面的两个案例,我们已经可以得知,连接池日常操作中,常用到的只有4个方法,分别为:
read_pop($timeOut = 3)
:读取业务,取出一个连接,$timeOut
为取出最大等待时间,默认3
秒。
read_free($obj)
:读取业务,归回一个连接
write_pop($timeOut = 3)
:写入业务,取出一个连接,$timeOut
为取出最大等待时间,默认3
秒。
write_free($obj)
:写入业务,归回一个连接
v1.0.13
版本后,新增一个:Log
日志连接池,专门用于处理日志类的数据库连接事务。
log_pop($timeOut = 3)
:取出一个连接,$timeOut
为取出最大等待时间,默认3
秒。
log_free($obj)
:归回一个连接
5、注意说明v1.0.12
我们在/config/laf.php
配置文件中可以看到,里面有max
参数可以控制连接池创建的最大上限。
其实这是不准确的,因为Swoole
是由多进程启动的服务,进程数出了可以自己限定外,默认是由机器的核数决定。
例如我们配置max
为100
,但启动的却是4
个进程数,那就等于启动的链接上限是:100 * 4
,这点需要大家额外注意的。
目前来看,我也没有很好的处理方法,有建议的朋友可以给我留言,或者加官方群进行交流学习。
1、连接池说明v1.0.13
WebScoket的Redis连接池是使用的Swoole\Coroutine\Channel
+Swoole\Coroutine\Redis
实现。
支持协程操作,但如果不熟悉协程的朋友,一次只需要获取一个连接进行操作即可,这样就不用担心存在协程切换导致出现BUG的问题。
PHPLAF Redis连接池不支持主从分离,如果要实现Redis主从分离,请自行在系统级配置中搞定。
Redis连接池,配置文件路径:/config/laf.php
如果关服需要清空连接池,可在onShutdown
事件中自行实现。
2、使用示例v1.0.13
Redis连接池使用 单例模式 实现,其类调用方法为:\pool\MysqlPool::run()->操作方法();
连接池的使用流程大致为:
1、从连接池中取出一个连接
2、取出Redis实例
3、执行redis指令
4、归回连接到连接池
下面我们来看个实例:
3、常用方法v1.0.13
pop($timeOut = 3)
:取出一个连接,$timeOut
为取出最大等待时间,默认3
秒。
free($obj)
:归回一个连接
1、说明v1.0.13
消息中心的原则是保存服务端callback
回推失败的记录,该记录会保存在数据库中,若重发次数超过laf.php
配置中指定的次数,则会转移到另一个log
数据表中。
只有log
数据表中的记录,才能在socketword
消息中心管理界面中看到。
消息中心的写入与统计在Tool::ajaxReturn()
中实现,每日成功失败的统计数存放在Redis
,失败记录存放在Mysql
。
消息重发在crontab/message_center_work.php
中,根据laf.php
配置中设定的时间与次数定时重发。
消息中心管理的界面在/socketword/message_center.php
。
更新日程
1、2019-07-21 开发者:小黄牛
2、2020-01-02 开发者:小黄牛
3、2020-01-03 开发者:小黄牛
4、2020-01-13 开发者:小黄牛
5、2020-02-28 开发者:小黄牛
6、2020-04-03 开发者:小黄牛
7、2020-04-09 开发者:小黄牛
8、2020-04-10 开发者:小黄牛
9、2020-04-20 开发者:小黄牛
10、2020-04-23 开发者:小黄牛
11、2020-04-27 开发者:小黄牛
12、2020-04-29 开发者:小黄牛
13、2020-05-06 开发者:小黄牛
注意事项
为了兼容linux系统的日常写入修改删除操作,以下有标记版本号的目录 或 文件 都需要手动设置0777
权限,否则将报错。