先说结果:fork 了 swoole 的源码,修复之后打了个 v1.10.7 的版本。
发现问题 由于各种原因项目在使用 swoole 的 v1.x 远古版本跑 TCP 服务,基础环境如下。
CentOS 6.9 PHP 5.5.38 然后遇到了程序偶发性超时情况严重。怀疑是版本bug,首先将 swoole 升级到了当前环境可用的最高版本 v1.10.6,问题依然没有解决。但是这个版本已经有了慢日志功能,将慢日志功能开起来,模拟程序阻塞超时,试试看功能可用否。
tcp_server.php
<?php class tcpTest { static public function aa() { self::bb(); } static public function bb() { sleep(3); } } class Server { static private $serv = null; private function __construct() { $serv = new \swoole_server("0.0.0.0", 9577); $serv->set([ 'reactor_num' => 2, 'worker_num' => 8, 'task_worker_num' => 0, 'dispatch_mode' => 2, 'daemonize' => false, 'tcp_fastopen' => true, 'request_slowlog_timeout' => 2, 'request_slowlog_file' => '/tmp/swoole_slow.log', 'trace_event_worker' => true, ]); $serv->on('Start', array($this, 'onStart')); $serv->on('Connect', array($this, 'onConnect')); $serv->on('Receive', array($this, 'onReceive')); $serv->on('Close', array($this, 'onClose')); $serv->start(); } public function onStart($serv) { echo __METHOD__ . PHP_EOL; } public function onConnect($serv, $fd, $from_id) { echo __METHOD__ . " worker_id:{$serv->worker_id} work_pid:{$serv->worker_pid} fd:{$fd} from_id:{$from_id}" . PHP_EOL; } public function onReceive($serv, $fd, $from_id, $data) { $fdinfo = $serv->connection_info($fd,$from_id,true); echo __METHOD__ . " ip:{$fdinfo['remote_ip']} worker_id:{$serv->worker_id} work_pid:{$serv->worker_pid} fd:{$fd} from_id:{$from_id} data:{$data}" . PHP_EOL; \tcpTest::aa(); $res_data = ['time' => date('Y-m-d H:i:s')]; $serv->send($fd, json_encode($res_data)); } public function onClose($serv, $fd, $from_id) { echo __METHOD__ . " worker_id:{$serv->worker_id} work_pid:{$serv->worker_pid} fd:{$fd} from_id:{$from_id}" . PHP_EOL . PHP_EOL; } static public function inst() { if (!(self::$serv instanceof self)) { self::$serv = new self; } return self::$serv; } } $res = \Server::inst(); tcp_client.php
...