325 Star 1.6K Fork 345

GVPswoole / swoole-src

 / 详情

关于长时间没有客户端连接服务失效的bug

待办的
创建于  
2017-05-18 22:05

下面是我一个代码都没改的程序

<?php
function getPdo(){
    $config=array(
        'host'=>$_SERVER['DATABASE__HOST'],
        'port'=>$_SERVER['DATABASE__PORT'],
        'dbname'=>$_SERVER['DATABASE__NAME'],
        'user'=>$_SERVER['DATABASE__USER'],
        'password'=>$_SERVER['DATABASE__PASSWORD']
    );
    $attr=array(
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT=>false,
        PDO::MYSQL_ATTR_INIT_COMMAND=>'set names utf8',
        PDO::ATTR_ORACLE_NULLS=>true,
        PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>false
    );
    $dns="mysql:host={$config['host']};port={$config['port']};dbname={$config['dbname']}";
    $pdo=new PDO($dns,$config['user'],$config['password'],$attr);
    return $pdo;
}
function getMoreBySql($sql)
{
    global $pdo;
    $stmt=$pdo->prepare($sql);
    $stmt->execute();
    $data=$stmt->fetchAll();
    return $data;
}
function exxcuteBySql($sql)
{
    global $pdo;
    $stmt=$pdo->prepare($sql);
    $stmt->execute();
}
//
$pdo=getPdo();
//
$server=new Swoole\Server('0.0.0.0',9500);
$server->set(array('worker_num'=>300,'daemonize'=>true));
$server->on('connect',function($server,$fd){});
$server->on('receive',function($server,$fd,$from_id,$data){
    $array=json_decode($data,true);
    $client=$array['client'];
    if(isset($array['isConnection'])){
        $server->send($fd,$data);
    }
    while(1){
        $now=date('Y-m-d H:i:s',time()-5);
        $sql="select id,dryFlag as flag,DryValue as value from log where dryClient='{$client}' and dryStatus=0 and dryAddTime>='{$now}' limit 10";
        $list=getMoreBySql($sql);
        if(!empty($list)){
            $in=array();
            foreach($list as $rs){
                $in[]=$rs['id'];
            }
            $in=implode(',',$in);
            exxcuteBySql("update log set dryStatus=1 where id in ({$in})");
            $server->send($fd,json_encode($list));
        }
        sleep(1);
    }
});
$server->on('close',function($server,$fd){});
$server->start();
?>

第一次启动后我用客户端连接,数据是可以交互的,可是隔一段时间后,基本10几个小时吧,客户端连接不会报错,然后ps -ef|grep server.php,程序都还在的,通过kill -9 $(ps -ef|grep server.php|awk '{print $1}')杀掉后重启,一切就正常了

下面是我客户端的代码(ip被改了而已)

<?php
$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on('connect', function($cli){
    $cli->send('{"client":"a"}');
});
$client->on('receive', function($cli, $data){
    echo $data."\n";
});
$client->on('error', function($cli){});
$client->on('close', function($cli){});
$client->connect('10.10.10.10', 9500, 0.5);
?>

评论 (0)

xxfaxy 创建了任务

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
C
1
https://gitee.com/swoole/swoole.git
git@gitee.com:swoole/swoole.git
swoole
swoole
swoole-src

搜索帮助