swoole_framework框架填坑

由于业务需求,采用了韩天峰老师的swoole_framework框架进行业务编写,在测试过程中遇到部分疑难杂症,再此记录


一、开启多个worker_num后,redis读写问题

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

$log['master'] = array(
    'type' => 'FileLog',
    'file' => ROOT_PATH . '/log/swoole.log'
);
return $log;

二、php webim_server.php start之后无法stop

找到log下面的webim_server.pid,查看其中的pid
执行
kill -9 pid
原因:在task中执行了某些操作,但是在stop的时候task仍无法结束 ,导致stop只停掉了websocket,而没有结束task,只能手动去kill掉,然后重新启动,主要关注task中的线程任务,记得及时回收。

三、在守护进程中,有时无法执行system命令操作shell

尝试使用nohup命令代替守护进程启动
nohup php webim_server.php start &
发现nohup的方法也会导致以上情况,考虑是onTask中没有return信息,导致线程没有被回收,从而变成僵尸线程,占用了线程创建的资源,于是尝试保证onTask方法有return 值,效果还在查看中。。

你可能感兴趣的:(php)