swoole websocket server记录

swoole websocket对象创建

//基类
abstract class Server
{
	//把实例存到属性中
    public $serv = null;

    public function __construct()
    {
	$this->serv = new \swoole_websocket_server('0.0.0.0',9501);
	//设置基本配置
	$this->serv->set(array(
		//进程个数,一般跟服务器核心数相同
        	'worker_num' => 4,
        	
        	//是否开启守护模式
         	'daemonize' => false,
         	
         	//Listen队列长度,如backlog => 128,此参数将决定最多同时有多少个等待accept的连接
        	'backlog' => 128, 
        	
		// 配置Task进程的数量,配置此参数后将会启用task功能。所以Server务必要注册onTask
        	'task_worker_num' => 1,
    	));
    	
        // Server启动在主进程的主线程回调此函数
        $this->serv->on('start', array($this, 'onStart'));
		
	// 此事件在Worker进程/Task进程启动时发生
	$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
		
	// websocket server的方法
        $this->serv->on('open', array($this, 'onOpen'));
        $this->serv->on('message', array($this, 'onMessage'));
        $this->serv->on('close', array($this, 'onClose'));
        
        // 启动服务
 	$this->serv->start();
    }
	
    /**
     * 服务启动回调函数
     * @param $server
     */ 
    public function onStart($server)
    {
        echo 'server 启动';
        echo SWOOLE_VERSION."\n";
    }

    /**
     * worker启动回调函数
     * @param $server
     * @param $worker_id
     */
    public function onWorkerStart($server, $worker_id)
    {
        if($worker_id >= 4){
            // 这是一个task进程
            echo '这是一个task进程,进程id为'.$worker_id."\n";
        } else {
        	echo 'worker进程:'.$worker_id."\n";
        }
    }
    
    /**
     * 链接关闭回调函数
     * @param $server
     * @param $fd
     */
    public function onClose($server, $fd)
    {
        // 获取当前客户端连接服务端的端口
        $server_port = $this->serv->connection_info($fd)['server_port'];
        echo '客户端:'.$fd.'断开了连接'."\n";
    }

	/**
     * websocket 链接进来
     * @param \swoole_websocket_server $svr
     * @param \swoole_http_request     $req
     * @return mixed
     */
    abstract function onOpen(\swoole_websocket_server $server, \swoole_http_request $req);
    
    abstract function onMessage(\swoole_websocket_server $_server, $frame);

}

关于websocket server的函数

Swoole\WebSocket\Server是Swoole\Server的子类,因此可以调用Swoole\Server的全部方法。

<?php
namespace app\swoole\controller;
use app\swoole\controller\Server;
class Run extends Server
{
	// websocket 连接进来
	public function onOpen(\swoole_websocket_server $server, \swoole_http_request $req)
	{
		$connection_info = $server->connection_info($req->fd);
		echo '当前连接客户端:'.$req->fd."\n";
		echo '当前连接客户端IP:'.$connection_info['remote_ip']."\n";
		echo '当前连接端口:'.$connection_info['server_port'];

	}

	// 接受消息
	public function onMessage(\swoole_websocket_server $_server, $frame)
	{
		$frame = json_decode(json_encode($frame),true);

		echo '收到消息:'.$frame['data']."\n";
	}
}

websocket 主要是使用3个方法,onOpen,onMessage,onClose 三个回调方法

调用顺序
1.首先会触发onStart事件
2.其次触发onWorkerStart事件,如果进程设置数为4,则会触发4次,如果再有2个task进程,则会触发6次
3.客户端进来后触发onOpen事件
4.客户端发送消息到服务端 触发onMessage事件
5.客户端退出 触发onClose事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值