• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

swoole8-信号驱动模型与event事件

开发技术 开发技术 4小时前 1次浏览

1. 信号模型

<?php
namespace ShineYorkIoSignal;

// 这是等会自个要写的服务
class Worker
{

    // 自定义服务的事件注册函数,
    // 这三个是闭包函数
    public $onReceive = null;
    public $onConnect = null;
    public $onClose = null;

    // 连接
    public $socket = null;

    public function __construct($socket_address)
    {
        $this->socket = stream_socket_server($socket_address);
        echo $socket_address."n";
    }

    // 需要处理事情
    public function accept()
    {
        // 接收连接和处理使用
        while (true) {
            $this->debug("accept start");

            // 监听的过程是阻塞的
            $client = stream_socket_accept($this->socket);
            pcntl_signal(SIGIO, $this->sigHander($client));
            posix_kill(posix_getpid(), SIGIO);
            // 分发
            pcntl_signal_dispatch();

            $this->debug("accept end");
            // 处理完成之后关闭连接
            // 心跳检测 - 自己的心跳
            // fclose($client);
        }
    }
    public function sigHander($client)
    {
        return function($sig) use ($client){
            // is_callable判断一个参数是不是闭包
            if (is_callable($this->onConnect)) {
                // 执行函数
                ($this->onConnect)($this, $client);
            }
            $data = fread($client, 65535);
            if (is_callable($this->onReceive)) {
                ($this->onReceive)($this, $client, $data);
            }
        };
    }
    public function debug($data, $flag = false)
    {
        if ($flag) {
            var_dump($data);
        } else {
            echo "==== >>>> : ".$data." n";
        }
    }
    // 发送信息
    public function send($client, $data)
    {
        $response = "HTTP/1.1 200 OKrn";
        $response .= "Content-Type: text/html;charset=UTF-8rn";
        $response .= "Connection: keep-alivern";
        $response .= "Content-length: ".strlen($data)."rnrn";
        $response .= $data;
        fwrite($client, $response);
    }


    // 启动服务的
    public function start()
    {
        $this->accept();
    }
}

 

缺点
信号I/O在大量IO操作时可能会因为信号队列溢出导致没法通知信号驱动I/O尽管对于处理UDP套接字来说有用,即这种信号通知意味着到达一个数据报,或者返回一个异步错误。但是,对于TCP而言,信号驱动的I/O方
式近乎无用,因为导致这种通知的条件为数众多,每一个来进行判别会消耗很大资源,与前几种方式相比优势尽失
 
4. event安装
 
由POSIX规范定义,应用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。这种模型与信号驱动模型的的主要区别在于于::信号驱动I/O是由内核
通知应用程序何时启动一个I/O操作,,而异步I/O模型是由内核通知应用程序I/O操作何时完成
在学习之前我们需要使用到PHP中的一个扩展函数Event 系列-> 事件; 手册地址 https://php.golaravel.com/class.event.html
第一步先安装:event 注意当前我们
首先需要安装一下linux系统的libevent,然后再安装php7,-event扩展,素材均以准备好;
 
$ tar -zxvf libevent-2.1.8-stable.tar.gz
$ cd libevent-2.1.8-stable
$ ./configure –prefix=/usr/local/libevent-2.1.8
$ make
$ make install
$ …
$ tar -zxvf event-2.3.0.tgz
$ cd event-2.3.0
$ phpize
$ ./configure –with-php-config=/www/server/php/73/bin/php-config
$ make
$ make install
$ php -m | grep event
 

程序员灯塔
转载请注明原文链接:swoole8-信号驱动模型与event事件
喜欢 (0)