<?php
define('CONNECT_IN_MSG', chr());
define('CONNECT_OUT_MSG', chr()); 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<) 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, );
$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 = ; $connection = stream_socket_accept($socket);
stream_set_blocking($connection, );
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, , );
event_buffer_watermark_set($buffer, EV_READ, , 0xffffff);
event_buffer_priority_set($buffer, );//超时自动断开时间
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] = ;
//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=;
while ($read = event_buffer_read($buffer, ))
{
$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 libevent 扩展使用示例的更多相关文章

  1. PHP Libevent扩展安装及应用

    http://www.phpddt.com/php/libevent.html PHP Libevent扩展安装及应用

  2. PHP libevent扩展安装

    libevent是一个基于事件驱动的高性能网络库.支持多种 I/O 多路复用技术, epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O,定时器和信号等事件: ...

  3. 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用

    网页游戏能用PHP做后端开发吗? 当然可以.最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端.stream_socket_server()多线程不是什么好主意,你可以用 ...

  4. php libevent扩展的简单用例

    php libevent扩展具有很强大的功能.以下摘自百度百科: Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能; ...

  5. php 安装 event 和 libevent 扩展

    这里使用的是php7.0.24 ,php是yum安装的 一.安装event扩展 用yum无法安装event扩展 手动安装 php 必须要开启 sockets 功能,需要安装php的socket扩展,才 ...

  6. 一个高在线(可以超过1024)多线程的socket echo server(pthreads 和 libevent扩展)

    研究了3周吧,本来打算用pthreads+event扩展的,结果event扩展太原始了,太多函数了,实在不知道怎么在外部随时发送数据给客户端,所以改用libevent, 改用libevent之后花了2 ...

  7. PHP安装libevent扩展

    1. 下载扩展 官方地址http://pecl.php.net/package/libevent 请根据自己的PHP脚本选择相应版本 如 wget http://pecl.php.net/get/li ...

  8. Chrome浏览器扩展开发系列之十九:扩展开发示例

    翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...

  9. libevent I/O示例

    I/O示例使用一个windows平台上服务器/客户端的例子来演示.由于为了减少代码篇幅等各种由于本人懒而产生的原因,以下代码没有做错误处理以及有些小问题,但是我想应该不影响演示,大家多包涵. 服务器代 ...

随机推荐

  1. iis上如何架设HTTPS网站

    对于HTTPS网站,大部分都比较陌生,觉得很难,其实只要申请好证书,只要在服务器上做下小配置就可以完成 首先,申请一个ssl证书 免费申请https://buy.wosign.com/free/Fre ...

  2. HTML5入门(CSS样式-------------------(CSS基础知识点----------------------------))

    CSS继承性+层叠性+盒子+浮动 一.CSS继承性 eg:                 <style>                               div{       ...

  3. linux vi基本操作

    在Linux下,可以键入vimtutor命令,有一个包含实操的vim教程. 1.VI的三种命令模式  1)Command(命令)模式,用于输入命令:  2)Insert(插入)模式,用于插入文本:  ...

  4. maven中央仓库访问速度太慢的解决办法

    方法一:修改settings.xml eclipse中集成的maven的settings.xml文件,找了半年也没找到,我们放弃eclipse中的maven,下一个最新的maven,并在eclipse ...

  5. 在基于vue的webpack脚手架开发中使用了代理转发,结果浏览器发出的请求中不带cookie导致登录时总是session失效怎么办?

    环境:            有2个业务接口需要转发到82的服务器上:     ../user/getCode.do     ../user/doLogin.do 现象:          使用上述的 ...

  6. 攻克Spring

    http://www.cnblogs.com/dream-to-pku/p/5655247.html

  7. CSS基本知识1-CSS基本概念

    CSS基本概念: 选择器{属性:值;属性:值} CSS继承:子元素继承父元素样式,父子关系看DOM结构. CSS覆盖: 浏览器缺省设置 外部样式表 内部样式表(位于 <head> 标签内部 ...

  8. docfx daylybuild

    参考:https://myget.org/gallery/docfx-dev 根据对应的vs或nuget版本中添加地址. PS:daylybuild可能包含很多错误哦.

  9. 前端ps常用的小技巧

    一些很简单的例子,知道的就当看乐子. 1.T 是文字的  可以从矢量图中查看文字的大小 字体 颜色,具体就是T  选择一段文字,点确定,点击属性栏最后一个可以看详细信息.又字体,行高,颜色.如果要选取 ...

  10. Android LitePal 神一般的数据库框架 超级好用

    参考: Android数据库高手秘籍(一)--SQLite命令 Android数据库高手秘籍(二)--创建表和LitePal的基本用法 Android数据库高手秘籍(三)--使用LitePal升级表 ...