后端 - 后台开发文档

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->redisv1.0.13版本后,改为Redis连接池)

7、生命周期v1.0.10

phplaf-websocket的生命周期流程主要如下(以下流程只对应最新版本):

其中有几点需要特别注意:

1、当第一次启动服务时,会触发onStartonWorkerStart事件,但当我们执行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/下的actionapicallback三个目录下的代码风格即可。

注意:对未定义_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.1Db类一致。

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种查询表达式,主要用于查询一条记录。主要不支持limitpage链。
该方法调用后会返回最终构造成的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种查询表达式,分别为:tablewhereorderlimit
该方法调用后会返回最终构造成的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种查询表达式,分别为:tablewhere
该方法调用后会返回最终构造成的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种查询表达式,分别为:tablewhere
该方法调用后会返回最终构造成的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种查询表达式,分别为:tablewhere
该方法调用后会返回最终构造成的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是由多进程启动的服务,进程数出了可以自己限定外,默认是由机器的核数决定。
例如我们配置max100,但启动的却是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权限,否则将报错。

文件以及目录说明