php libevent 扩展使用示例
2023-09-14 08:59:33 时间
<?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\n"); 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."\n"; } 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."\n"; //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).'\n'; $mid = self::$fd2pid[$id]; //self::$msgs[$mid]->send($read , $id); } } }
相关文章
- 基础面试题php
- php和asp网络验证码,Verifycode 1个简单的网页图片验证码的示例程序,基本上现有 字和字母都可以识别。 WEB(ASP,PHP,…) 238万源代码下载- www.pudn.com…
- 展现魅力:PHP支持MySQL扩展(php支持mysql扩展)
- 开发Linux下PHP模块开发:实现程序性能最大化(linux下php模块)
- 深入PHP:实现MySQL数据库更新(php更新mysql)
- PHP扩展插件imagick使用笔记详解编程语言
- PHP扩展开发:实现Redis读写数据(php扩展redis)
- 特定数据实现MySQL数据库中特定数据的PHP显示(phpmysql显示)
- 分钟结合简单快捷:PHP跟MySQL搭配,5分钟搞定!(php与mysql5)
- Linux更新PHP,提升程序品质(linux更新php)
- ubuntu 12.04 安装 Nginx+PHP5 (PHP-FPM) +MySQL主机详解
- 数据库MySQL 数据库的 PHP 扩展研究(php扩展mysql)
- PHP连接MySQL的快速操作指南(php连接mysql步骤)
- Redis实现长连接:PHP开发入门(redis长连接php)
- 脚本Linux下使用PHP启动脚本指南(linux下php启动)
- 扩展如何在PHP中开启Redis扩展(php开启redis)
- PHP使用Redis扩展连接Redis服务(php开启redis)
- 使用PHP轻松循环MySQL,让数据处理变得更容易(php循环mysql)
- php建立你的网站:使用 Apache、MySQL 和 PHP(httpdmysql)
- 构建LAMP环境 以增加PHP的MSSQL扩展(增加php扩展mssql)
- 优雅式PHP配置MySQL数据库(php 配置 mysql)
- PHP连接MSSQL数据库的实战指南(php连接mssql示例)
- 使用PHP扩展开发MSSQL应用(php扩展使用mssql)
- PHP与MSSQL数据库之间的转义学习(php mssql 转义)
- 仅用PHP操作MSSQL,实现快速下载!(php mssql下载)
- PHP开启Redis扩展:极大提升网站性能(php开启redis扩展)
- 使用Redis需要PHP版本满足特定要求(redis需要php版本)
- Redis实现PHP限流策略(redis限流php)
- php下常用表单验证的正则表达式
- php学习笔记PHP面向对象的程序设计