问题表现:公司项目生产环境进行服务器调整后,启动聊天服务时出现问题,报错代码如下,
PHP Fatal error: Uncaught Noodlehaus\Exception\UnsupportedFormatException: Unsupported configuration format in /…隐藏项目路径…/vendor/hassankhan/config/src/Config.php:94 Stack trace: #0 /…隐藏项目路径…/vendor/hassankhan/config/src/Config.php(66): Noodlehaus\Config->getParser(‘0304’) #1 /…隐藏项目路径…/vendor/tmtbe/swooledistributed/src/Server/SwooleServer.php(166): Noodlehaus\Config->__construct(’/www/wwwroot/li…’) #2 /…隐藏项目路径…/vendor/tmtbe/swooledistributed/src/Server/SwooleServer.php(149): Server\SwooleServer->setConfig() #3 /…隐藏项目路径…/vendor/tmtbe/swooledistributed/src/Server/SwooleHttpServer.php(29): Server\SwooleServer->__construct() #4 /…隐藏项目路径…/vendor/tmtbe/swooledistributed/src/Server/SwooleWebSocketServer.php(29): Server\SwooleHttpServer->__construct() #5 /…隐藏项目路径…/vendor/tmtbe/swooledistributed/src/Server/SwooleDistributedServer.php(113): Server\SwooleWebSocketServer->__construct() #6 /ww in /…隐藏项目路径…/vendor/hassankhan/config/src/Config.php on line 94
问题排查:在测试服上测试代码可以正常运行,最初怀疑是否因为正式服上PHP swoole环境调整导致;联系运维PHP版本,扩展,redis数据库版本都没有调整;并且在同一台服务器上运行的其他ws长连接服务全部正常;于是将问题定位在/…隐藏项目路径…/vendor/hassankhan/config/src/Config.php(66): Noodlehaus\Config->getParser(‘0304’)
最初将0304定位为SD框架自定义的错误号,百度,csdn查询SD 0304均无结果;后发现一般框架在定义错误号的时候不会使用0开头;于是联想到0304表示日期,检查配置文件src/config文件夹中果然发现一个文件redis.php.0304;联系运维删除该文件,服务启动正常;
总结:在排查问题时未仔细看错误说明中提到了扩展格式不支持(UnsupportedFormatException),一直将0304当成错误号排查问题;并且一般运维在做运行环境调整时候习惯将老文件以日期的形式做备份,如
cp redis.php redis_0304.php或
cp redis.php redis.php.0304
正好SD框架在启动时会遍历配置文件夹中各配置文件,有非法后缀名的配置文件框架不允许启动。
SD框架配置文件夹中src/config的配置文件取名必须以php结尾,并且使用框架定义的文件,以免出现问题;