swoole http或wesocket单个进程内的on->open等,会不会一个没处理完先暂停,就开启下一个?

发布于 2022-09-12 00:03:31 字数 73 浏览 19 评论 0

我的理解是,on->open内的处理完,有协程等待的也要完成后,才开启下另一个on->open协程 不知道对不对?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

用心笑 2022-09-19 00:03:31

开启了协程,并且程序内有阻塞的协程代码co::开始的,就会暂停,记录下测试代码

            #echo "\n1|".'进程:'.$http->worker_id.'|fd:'.$request->fd.'|协程:'.Swoole\Coroutine::getCid().'开始时间:'.sprintf('%.8f',microtime(true));
            C('fd',$request->fd);
            $response->header("Content-Type", "text/html; charset=utf-8");
            $response->end('1');
            //sleep(1);
            if(C('fd')!=$request->fd){
                echo "\n2".C('fd').'|'.$request->fd;
            }
            #echo "\n3|".'进程:'.$http->worker_id.'|fd:'.$request->fd.'|协程:'.Swoole\Coroutine::getCid().'结束时间:'.sprintf('%.8f',microtime(true));
            echo "\n2|".'进程:'.$http->worker_id.'|fd:'.$request->fd.'|协程:'.Swoole\Coroutine::getCid().'|connections length:'.count($http->connections);

通过下在代码测试 如果协程内有等待会暂停了,开启另一个open

$user = posix_getpwnam('www');
posix_setuid($user['uid']);
posix_setgid($user['gid']);
$redis=new Redis;
$redis->pconnect('127.0.0.1', 6379); 
$redis->del('set'); 
$redis->set('redis_new',0); 
$pool = new RedisPool();

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);
$ws->set(array(
    'max_connection'=>20000,
    'worker_num' => 1,    //开启两个worker进程
    'max_request' => 0,   //每个worker进程max request设置为3次
    'dispatch_mode'=>2,
    'heartbeat_check_interval' => 1800,//5秒侦测一次心跳,一个TCP在10秒内未向服务器端发送数据,将会被切断
    'heartbeat_idle_time' => 1810,
    'user'=>'www',
    'group'=>'www'
));
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request)use($pool) {
    $redis = $pool->get($ws->worker_id,$request->fd);
    $redis->sadd('set',$request->fd);
    echo "\n1|进程:".$ws->worker_id.'|fd:'.$request->fd.'|conns:'.count($ws->connections).'|redisconns:'.$redis->scard('set').'|协程:'.Swoole\Coroutine::getCid();    
    $pool->put($redis);
});

//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    echo "\n2|进程:".$ws->worker_id.'|fd:'.$frame->fd.'|conns:'.count($ws->connections).'|协程:'.Swoole\Coroutine::getCid();    

});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd)use($pool) {
    $redis = $pool->get($ws->worker_id,$fd);
    $redis->srem('set',$fd);
    echo "\n3|进程:".$ws->worker_id.'|fd:'.$fd.'closed'.'|conns:'.count($ws->connections).'|redisconns:'.$redis->scard('set').'|协程:'.Swoole\Coroutine::getCid();
    $pool->put($redis);
});
$ws->start();












<?php
//RedisPool与Pool功能没区别 一个普通类 一个静态类使用方便
class Pool
{
    protected static function p()
    {
        static $pool=NULL;
        if($pool===NULL){
            $pool=new Swoole\Coroutine\Channel(self::len());
        }
        return $pool;
    }
    public static function len($decrease=0)
    {
        static $len=10000;//定义最多多少个链接
        if($decrease!=0){
            $len--;
        }
        return $len;
    }
    public static function put($redis)
    {
        self::p()->push($redis);
    }
    
    public static function count()
    {
       return self::p()->length();
    }
    

    public static function get()
    {
        //有空闲连接 或都创建了  
        if (self::p()->length() > 0 || self::len()==0 ){
            return self::p()->pop();
        }
        self::len(-1);
        //无空闲连接,创建新连接
        $redis = new Swoole\Coroutine\Redis();
        do{
            $res = $redis->connect(C('REDIS_HOST'), C('REDIS_PORT'));
        }while(!$res);

        if ('' != C('REDIS_PASSWORD')){
            $redis->auth(C('REDIS_PASSWORD'));
        }
        if (0 != C('REDIS_SELECT')){
            $redis->select(C('REDIS_SELECT'));
        }
        return $redis;
    }
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文