对socket的代码学习和自我理解与记录 epoll模式

给你一囗甜甜゛ 提交于 2019-12-26 12:18:06

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

epoll模式 主要就是直接对socket进行监听,不需要轮询,如果socket有状态变化就会触发
<?php

class Worker{
    //监听socket
    protected $socket = NULL;
    //连接事件回调
    public $onConnect = NULL;
    //接收消息事件回调
    public $onMessage = NULL;
    public $workerNum=4; //子进程个数
    public  $allSocket; //存放所有socket

    public function __construct($socket_address) {
        //监听地址+端口
        $this->socket=stream_socket_server($socket_address);
    }

    public function start() {
        //获取配置文件
        $this->fork();
    }

    public function fork(){
        $this->accept();//子进程负责接收客户端请求
    }
    public  function  accept(){

        //第一个需要监听的事件(服务端socket的事件),一旦监听到可读事件之后会触发
        swoole_event_add($this->socket,function ($fd){
                $clientSocket=stream_socket_accept($fd);
                //触发事件的连接的回调
                if(!empty($clientSocket) && is_callable($this->onConnect)){
                    call_user_func($this->onConnect,$clientSocket);
                }
            //监听客户端可读
            swoole_event_add($clientSocket,function ($fd){
                //从连接当中读取客户端的内容
                $buffer=fread($fd,1024);
                //如果数据为空,或者为false,不是资源类型
                if(empty($buffer)){
                    if(feof($fd) || !is_resource($fd)){
                        //触发关闭事件
                        fclose($fd);
                    }
                }
                //正常读取到数据,触发消息接收事件,响应内容
                if(!empty($buffer) && is_callable($this->onMessage)){
                    call_user_func($this->onMessage,$fd,$buffer);
                }
            });
        });
        echo "非阻塞";
die('eee');
    }

}



$worker = new Worker('tcp://0.0.0.0:9801');

//连接事件
$worker->onConnect = function ($fd) {
    //echo '连接事件触发',(int)$fd,PHP_EOL;
};

//消息接收
$worker->onMessage = function ($conn, $message) {
    $content="123";
    $http_resonse = "HTTP/1.1 200 OK\r\n";
    $http_resonse .= "Content-Type: text/html;charset=UTF-8\r\n";
    $http_resonse .= "Connection: keep-alive\r\n"; //连接保持
    $http_resonse .= "Server: php socket server\r\n";
    $http_resonse .= "Content-length: ".strlen($content)."\r\n\r\n";
    $http_resonse .= $content;
    fwrite($conn, $http_resonse);
};

$worker->start(); //启动
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!