由于业务需求,采用了韩天峰老师的swoole_framework框架进行业务编写,在测试过程中遇到部分疑难杂症,再此记录
一、开启多个worker_num后,redis读写问题
问题描述:开启多个worker_num,redis读数据时失败,或读出:0
、*0
之类的数据。
解决过程:
首先明确了,开启多个worker_num后,这个bug几乎是必现的,特别是在set redis的时候,会返回false。多次调试没有结果,猜测是并发调用redis导致的异常,(在php代码中,get数据的时候是:0
但是在redis客户端查看数据的时候却是好的)。
由于是做同步ppt笔记、鼠标演示的项目,里面有比较频繁的读写redis的地方,却只在翻页的时候(给各个房间中的成员发送翻页消息,各个成员重新进入页面房间时,发生问题。)出现,而且只有master(演示者)出现。查看log发现log记录:log->master is not found.
,猜测是否是因为这一段报错,导致程序发生了某些不可预知的bug,于是决定找到报错的原因。
发现是因为config类没有获取到log这个config导致错误信息无法记录二抛出的错误。去github上查看韩天峰老师的项目代码,发现config中并没有配置log.php这个文件,而是在server.php的构造函数中声明了log类。(错误路径: vendor/matyhtf/swoole_framework/libs/factory/log.php
)
解决方法:在configs
目录中加入log.php
。
<?php
$log ['master' ] = array (
'type' => 'FileLog' ,
'file' => ROOT_PATH . '/log/swoole.log'
);
return $log ;