必须结合多维度日志交叉验证:先确认PHP版本路径,查FPM日志(/www/server/php/80/var/log/php-fpm.log)和CLI加载错误,再检查Swoole运行时日志、性能统计及Nginx代理日志,缺一不可。

排查宝塔面板安装Swoole扩展失败、服务启动异常或性能抖动时,必须结合多维度日志交叉验证——仅看php -m输出成功不代表Web环境可用,也不代表协程调度正常。
定位PHP扩展加载失败的日志源
先确认你操作的是哪个PHP版本:进入宝塔面板→软件商店→找到已安装的PHP 80(或82/83),点击“设置”→“配置修改”,顶部会显示该PHP版本的实际路径,例如/www/server/php/80/。所有日志路径都以此为基准。
打开终端,执行:tail -n 50 /www/server/php/80/var/log/php-fpm.log
重点查找含swoole.so、undefined symbol、failed to load的行。如果看到dlopen() failed: swoole.so: cannot open shared object file,说明extension路径写错或so文件根本没生成。
【必须同时检查CLI和FPM两套日志】:FPM日志在/www/server/php/80/var/log/php-fpm.log,CLI无独立日志,但执行/www/server/php/80/bin/php --ri swoole 2>&1 | grep -E "(error|warning|not found)"可捕获加载错误。
验证Swoole服务运行时异常日志
方法一:直接查看Swoole进程标准错误输出
如果你用php server.php方式启动了WebSocket或HTTP服务器,启动命令末尾加2>&1 >> /www/wwwroot/logs/swoole_error.log重定向错误流。
方法二:启用Swoole内置日志功能(推荐)
在服务启动脚本开头添加:
Swoole\Runtime::setHookFlags(SWOOLE_HOOK_ALL);Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]);Swoole\Error::$log_level = SWOOLE_LOG_ERROR | SWOOLE_LOG_WARNING;Swoole\Error::setLogFile('/www/wwwroot/logs/swoole_runtime.log');
这一步不做,协程超时、DNS解析失败、SSL握手拒绝等静默错误将完全丢失。
分析高并发下性能瓶颈日志
第一步:开启Swoole性能统计
在Swoole服务代码中加入:
$server->on('workerStart', function ($server, $worker_id) { if ($worker_id === 0) { Swoole\Server::addSystemTimer(5000, function () use ($server) { file_put_contents('/www/wwwroot/logs/swoole_stats.log', date('Y-m-d H:i:s') . print_r($server->stats(), true) . "\n", FILE_APPEND); }); }});
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
第二步:监控关键指标
每5秒记录一次connection_count(当前连接数)、accept_count(总接受连接)、close_count(主动关闭数)。若close_count突增且connection_count持续低于accept_count差值,说明客户端频繁断连,需查Nginx反向代理超时或前端心跳机制。
第三步:抓取慢请求堆栈
当发现响应延迟升高,在服务中启用协程追踪:
Swoole\Coroutine::set(['trace_flags' => SWOOLE_TRACE_COROUTINE]);ini_set('swoole.trace_log_level', SWOOLE_LOG_WARNING);Swoole\Error::setLogFile('/www/wwwroot/logs/swoole_trace.log');
该日志会记录每个协程创建、挂起、销毁的毫秒级时间戳,配合grep "coroutine #\d\+ took \d\+ms"可快速定位耗时协程。
排查HTTPS/WebSocket握手失败日志
方法1:检查Nginx错误日志定位代理层问题
执行:tail -n 30 /www/wwwlogs/nginx_error.log
若出现upstream prematurely closed connection while reading response header from upstream,说明Swoole服务进程崩溃或未正确返回HTTP头;若出现SSL_do_handshake() failed,则需检查Swoole SSL配置中证书路径是否指向真实文件(不能是软链接)。
方法2:启用Swoole WebSocket详细握手日志
在$server = new Swoole\WebSocket\Server(...)后立即添加:
$server->set([ 'log_file' => '/www/wwwroot/logs/ws_handshake.log', 'log_level' => SWOOLE_LOG_DEBUG,]);
该配置会记录每次onOpen前的完整HTTP Upgrade请求头,包括Sec-WebSocket-Key、Origin、Cookie字段,便于排查跨域或鉴权拦截。










