zoukankan      html  css  js  c++  java
  • php libevent 扩展使用示例

    <?php  
    define('CONNECT_IN_MSG', chr(1));  
    define('CONNECT_OUT_MSG', chr(2));  
      
      
    class epoll{  
        private static $socket;  
        public static $connections;  
        private static $buffers;  
        //private static $msgs;  
        public static $fd2pid = array();  
        public static $blocked_ips = array();  
        //private static $link_msg;  
        function epoll($port, &$_msgs){//, &$_link_msg  
            //self::$msgs = $_msgs;  
            //self::$link_msg = $_link_msg;  
            if($port<1024) die("Port must be a number which bigger than 1024
    ");  
            self::$socket = stream_socket_server ('tcp://0.0.0.0:'.$port, $errno, $errstr);  
            stream_set_blocking(self::$socket, 0);  
            $base = event_base_new();  
            $event = event_new();  
            event_set($event, self::$socket , EV_READ | EV_PERSIST, 'epoll::ev_accept', $base);  
            event_base_set($event, $base);  
            event_add($event);  
            event_base_loop($base);  
      
            self::$connections = array();  
            self::$buffers = array();  
            //echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);  
        }  
        public static function ev_accept($socket, $flag, $base) {  
            //echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);  
            static $id = 0;  
      
            $connection = stream_socket_accept($socket);  
            stream_set_blocking($connection, 0);  
            list($remoteIP, $remotePort) = explode(':',stream_socket_get_name($connection,true));  
              
            $id ++;  
      
            $buffer = event_buffer_new($connection, 'epoll::ev_read', NULL, 'epoll::ev_error', $id);  
            event_buffer_base_set($buffer, $base);  
            event_buffer_timeout_set($buffer, 30, 30);  
            event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);  
            event_buffer_priority_set($buffer, 60);//超时自动断开时间  
            event_buffer_enable($buffer, EV_READ | EV_PERSIST);  
      
            // we need to save both buffer and connection outside  
            self::$connections[$id] = $connection;  
            self::$buffers[$id] = $buffer;  
            //self::$link_msg->send(CONNECT_IN_MSG.$remoteIP.','.$remotePort, $id);  
              
            self::$fd2pid[$id] = 0;  
            //echo 'In-> $id='.$id.',$connection='.$connection."
    ";  
        }  
        public static function ev_error($buffer, $error, $id) {  
            event_buffer_disable(self::$buffers[$id], EV_READ | EV_WRITE);  
            event_buffer_free(self::$buffers[$id]);  
            //echo 'Ot-> $id='.$id."
    ";  
            //self::$link_msg->send(CONNECT_OUT_MSG, $id);  
            fclose(self::$connections[$id]);  
            unset(self::$fd2pid[$id]);  
            unset(self::$buffers[$id], self::$connections[$id]);  
        }  
        public static function ev_read($buffer, $id) {  
            //echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);  
            static $ct=0;  
            while ($read = event_buffer_read($buffer, 256))  
            {  
                $ct+=strlen($read);  
                if(strpos($read,'ct')!==false) echo 'Ct=>'.count(self::$connections).'
    ';  
                $mid = self::$fd2pid[$id];  
                //self::$msgs[$mid]->send($read , $id);  
            }  
        }  
      
    }  
  • 相关阅读:
    如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage
    如何在MVC_WebAPI项目中的APIController帮助页面添加Web测试工具测试
    exception throw in progress runner thread_VS2015中SVN源代码无说明提交异常
    [转]AMBA、AHB、APB、ASB总线简介
    UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例
    UML和模式应用4:初始阶段(5)--用例编写的准则
    startup_MK64F12.s文件解析
    [转] bss段、data段、text段
    [转]GDB-----2.watchpoint
    [转]GDB-----1.GDB概述
  • 原文地址:https://www.cnblogs.com/archoncap/p/6136374.html
Copyright © 2011-2022 走看看