Swoole Echo服务器随意搭建 及set函数详解

<?php
//Server
Class Server
{
    private $serv;

    /**
     * 链接swoole服务器
     * Server constructor.
     */
    public function __construct()
    {
        //创建swoole_server对象
        $this->serv = new swoole_server('0.0.0.0', 9501);
        //set函数配置swoole_server
        $this->serv->set([
            'worker_num' => 8, //指定启动worker的进程数

            'max_request' => 10000, //每个worker进程最大运行处理任务的个数

            'max_conn' => 10000, //服务器允许维持最大的TCP连接数 不能超过操作系统ulimit -n的值

            'ipc_mode' => 1, //设置进程间的通讯方式 1-使用unix socket连接 2-消息队列通讯 3-消息队列通讯 并设置为争抢模式

            'dispath_mode' => 1, //指定数据包分发策略 1-轮询模式 (轮询分配给每一个worker进程)
                                                    #2-固定模式 根据连接文件描述符分配worker 保证同一个连接发来的数据只被一个worker处理
                                                    #3-争抢模式 主进程会根据每个worker的闲忙程度选择投递,只会投递给闲置状态的worker进程

            'task_worker_num' => 8, //服务器开启task进程数 设置参数后开启异步task功能。可以使用task方法投递异步任务
                                    //注:设置参数后必须给swoole_server设置onTask/onFinish两个回调函数

            'task_max_request' => 10000, //每个task进程最大允许处理任务的个数 参考(max_request)

            'task_ipc_mode' => 2, //设置task进程与worker进程之间的通讯方式  参考(ipc_mode)

            'daemonize' => false, //设置程序进入后台作为守护进程运行
                                    #注:长时间运行的服务器端程序必须启用此项。如果不启用守护进程,当ssh终端退出后,程序将被终止运行。
                                    #启用守护进程后,标准输入和输出会被重定向到 log_file,如果 log_file未设置,则所有输出会被丢弃。

            'log_file' => '/data/log/swoole.log', //指定日志文件目录
                                                    #在swoole运行期发生的异常信息会记录到这个文件中。默认会打印到屏幕。
                                                    #注意log_file 不会自动切分文件,所以需要定期清理此文件。

            'health_check_interval' => 60, //设置心跳检测间隔
                                            #此选项表示每隔多久轮循一次,单位为秒。每次检测时遍历所有连接,如果某个连接在间隔时间内没有数据发送,则强制关闭连接(会有onClose回调)。

            'heartbeat_idle_time' => 600, //设置某个连接数允许最大的闲置时间
                                            #该参数配合heartbeat_check_interval使用。每次遍历所有连接时,如果某个连接在heartbeat_idle_time时间内没有数据发送,则强制关闭连接。
                                            #默认设置为heartbeat_check_interval * 2。

            'open_eof_check' => true, //打开eof检测功能。与package_eof 配合使用。此选项将检测客户端连接发来的数据,当数据包结尾是指定的package_eof 字符串时才会将数据包投递至Worker进程,否则会一直拼接数据包直到缓存溢出或超时才会终止。
                                        #一旦出错,该连接会被判定为恶意连接,数据包会被丢弃并强制关闭连接。
                                        #EOF检测不会从数据中间查找eof字符串,所以Worker进程可能会同时收到多个数据包,需要在应用层代码中自行explode("\r\n", $data) 来拆分数据包

            'package_eof' => '\r\n', //设置EOF的字符串 最大只允许传入8个字符串

            'open_length_check' => true, //打开长包检测
                                        #包长检测提供了固定包头+包体这种格式协议的解析,。启用后,可以保证Worker进程onReceive每次都会收到一个完整的数据包。

            'package_length_offset' => 5, //包头中开始字符串开始存放了字段长度
                                          #配合open_length_check使用,用于指明长度字段的位置。

            'package_body_offset' => 10, //从第几个字符串开始计算长度
                                            #配和open_length_checks使用,用于指明包头长度

            'package_length_type' => 'N',  #配合open_length_check使用,指定长度字段的类型,参数如下:
                                           #'s' => int16_t 机器字节序
                                           #'S' => uint16_t 机器字节序
                                           #'n' => uint16_t 大端字节序
                                           #’N‘ => uint32_t 大端字节序
                                           #'L' => uint32_t 机器字节序
                                           #'l' => int 机器字节序

            'package_max_length' => 8192, //设置最大数据包尺寸
                                            #该值决定了数据包缓存区的大小。如果缓存的数据超过了该值,则会引发错误。具体错误处理由开启的协议解析的类型决定。

            'open_cpu_affinity' => true, //启动cup亲和性设置
                                            #在多核的硬件平台中,启用此特性会将swoole的reactor线程/worker进程绑定到固定的一个核上。
                                            #可以避免进程/线程的运行时在多个核之间互相切换,提高CPU Cache的命中率。

            'open_tcp_nodelay' => true, //开启后TCP连接发送数据时会无关闭Nagle合并算法,立即发往客户端连接。
                                        #在某些场景下,如http服务器,可以提升响应速度。

            'tcp_defer_accept' => true, //启动后,只有一个TCP连接有数据发送时才会触发accept。

            'ssl_cert_file' => "/config/ssl.crt",  //设置SSL隧道加密
            'ssl_key_file' => "/config//ssl.key",
                                                    #说明:设置值为一个文件名字符串,指定cert证书和key的路径。

            'open_tcp_keepalive' => true, //打开TCP的KEEP_ALIVE选项
                                            #使用TCP内置的keep_alive属性,用于保证连接不会因为长时闲置而被关闭。

            'tcp_keepidle' => 600, //指定探测时间 配合open_tcp_keepalive使用,如果某个连接在tcp_keepidle内没有任何数据来往,则进行探测。

            'tcp_keepinterval' => 60, //指定探测时的发包间隔
                                        #配合open_tcp_keepalive使用

            'tcp_keepcount' => 5,  //指定探测的尝试次数
                                     #配合open_tcp_keepalive使用,若tcp_keepcount次尝试后仍无响应,则判定连接已关闭。

            'backlog' => 128, //指定队列长度
                                #此参数将决定最多同时有多少个等待accept的连接。

            'reactor_num' => 8, //指定Reactor线程数
                                  #设置主进程内事件处理线程的数量,默认会启用CPU核数相同的数量, 一般设置为CPU核数的1-4倍,最大不得超过CPU核数*4。

            'task_tmpdir' => '/tmp/task/', //设置task的数据临时目录
                                            #如果投递的数据超过8192字节,将启用临时文件来保存数据。这里的task_tmpdir就是用来设置临时文件保存的位置。

        ]);
        //调用on函数设置相关回调函数
        $this->serv->on('Start', [$this, 'onStart']); //开启    在server运行前调用
        $this->serv->on('Connect', [$this, 'onConnect']); //链接  在有新的client客户端请求时被调用
        $this->serv->on('Receive', [$this, 'onReceive']); //接受  有数据被发送到server时被调用
        $this->serv->on('Close', [$this, 'onClose']); //关闭      有客户端断开连接时被调用

        $this->serv->start();
    }

    /**
     * 开启
     * @param $serv
     */
    public function onStart($serv)
    {
        echo "Start\n";
    }

    /**
     * 链接
     * @param $serv
     * @param $fd
     * @param $from_id
     */
    //在connect处监听新的客户端请求
    public function onConnect($serv, $fd, $from_id)
    {
        $serv->send($fd, "Hello {$fd}!");
    }

    /**
     * 接受
     * @return [type] [deception]
     */
    //在onReceive接受请求并处理
    public function onReceive(swoole_server $serv, $fd, $from_id, $data)
    {
        echo "Get Message From Client {$fd}:{$data}\n";
        //使用send函数将处理结果发送出去
        $serv->send($fd, $data);
    }

    /**
     * 关闭
     * @return [type] [deception]
     */
    //onClose处理客户端下线事件
    public function onClose($serv, $fd, $from_id)
    {
        echo "Client {$fd} close connection\n";
    }

}
/*启动Server*/
$server = new Server();

client(客户端)

<?php 
Class Client
{
    private $client;

    /**
     * 建立swoole连接
     * Client constructor.
     */
    public function __construct()
    {
        $this->client = new swoole_client(SWOOLE_SOCK_TCP);
    }

    /**
     * 建立连接
     * @return [type] [deception]
     */
    public function connect()
    {
        if( !$this->client->connect('127.0.0.1', 9501, 1)) {
            echo "Error: {$this->client->errMsg}[{$this->client->errCode}]\n";
        }
        fwrite(STDOUT, "客户端请输入消息:");
        $msg = trim(fgets(STDIN));
        $this->client->send($msg);

        $message = $this->client->recv();
        echo "对方Server输入的信息是:{$message}\n";
    }
}

/**
 * 开启连接
 */
$client = new Client();
$client->connect();

猜你喜欢

转载自blog.csdn.net/ltstud/article/details/83028458