PHP中的Libevent学习
wangbin@2012,1,3
目录
Libevent在php中的应用学习
1、 Libevent介绍
2、 为什么要学习libevent
3、 Php libevent 扩展模块安装
4、 Libevent常量及php函数
5、 Select/poll模型
6、 epoll/kqueue模型
1、 libevent介绍
libevent是一个事件触发的网络库,适用于windows、linux、freebsd等多种平台,内部使用select、poll、epoll、kqueue等系统调用管理事件机制。Libevent是跨平台的,而且具有非凡的性能。与nodejs一样是事件驱动的;官方网站:http://libevent.org/
最新的稳定版本
https://github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz
主要模块:
事件处理框架
事件引擎模块
Buffer管理模块
信号处理模块
php本身不支持多线程,php不能很好实现并发机制。Pecl提供的pcntl(进程控制)、libevent扩展、socket包、stream系统函数,可以使用php轻易地开发出高性能,高并发的网络应用程序。
简单应用事例:Pcntl fork n个worker。master process 得到请求后,处理信息发送给worker程序、worker处理完后回传给client。Master process 可以跟据并发量,来设定worker的数量,即n的大小,并monitor(监控)worker的数据,在不足时启动更多的进程。同nginx原理。
附:Php网络编程框架
http://code.google.com/p/swoole/downloads/list
2、 为什么要学习libevent
http server可以说是libevent的经典应用。可以从libevent当中找到http的标准写法,非阻塞的http server也就是socket处理与http协议处理缠绕。
学习libevent有助于提升程序设计功力,除了网络程序设计方面外,Libevent的代码里有很多有用的设计技巧和基础数据结构,比如信息隐藏、函数指针、c语言的多态支持、链表和堆等等,都有助于提升自身的程序功力[1]。
对请求的处理的三种类型:
1、 connection input fork a new process
2、 connection input pthread_create
3、 connection input throw a Event-based array; main process do nonblocking things;
3、 Php libevent 扩展模块安装
Curl –O https://github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz
Tar –zxvf libevent-2.0.16-stable.tar.gz
Cd libevent-2.0.16-stable
/usr/local/php/bin/phpize
./configure
make
make install
vi /usr/local/php/etc/php.ini
extension_dir=””;
extension=libevent.so
php –m | grep lib
安装成功
4、 Libevent常量及php函数
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
#define EV_PERSIST 0x10
#define EV_ET 0x20
#define EVLOOP_ONCE 0x01
#define EVLOOP_NONBLOCK 0x02
|
值 |
常量名 |
含义 |
|
1 |
EV_TIMEOUT |
超过时间后事件成为激活状态 |
|
2 |
EV_READ |
FD就绪,可以读取的时候 ,事件成为激活状态 |
|
4 |
EV_WRITE |
FD就绪,可以写入的时候 ,事件成为激活状态 |
|
8 |
EV_SIGNAL |
用于实现信号检测 |
|
16 |
EV_PERSIST |
表示事件是持久的 |
|
32 |
EV_ET |
表示底层是否支持边沿触发事件 |
|
1 |
EVLOOP_ONCE |
如果设置了EVLOOP_ONCE,循环将等待某些事件成为激活的,执行激活的事件直到没有更多的事件可以执行,然会返回。 |
|
2 |
EVLOOP_NONBLOCK |
如果设置了EVLOOP_NONBLOCK,循环不会等待事件被触发:循环将仅仅检测是否有事件已经就绪,可以立即触发,如果有,则执行事件的回调。 |
event_base_freee()
释放资源,这不能销毁绑定事件
event_base_loop()
处理事件,根据指定的base来处理事件循环
event_base_loopbreak()
立即取消事件循环,行为各break语句相同
event_base_loopexit()
在指定的时间后退出循环
event_base_new()
创建并且初始事件
event_base_priority_init()
设定事件的优先级
event_base_set()
关联事件到事件base
event_buffer_base_set()
关联缓存的事件到event_base
event_buffer_disable()
禁用一个缓存的事件
event_buffer_enable()
启用一个指定的缓存的事件
event_buffer_fd_set()
改变一个缓存的文件系统描述
event_buffer_free()
释放缓存事件
event_buffer_new()
建立一个新的缓存事件
event_buffer_priority_set()
缓存事件的优先级设定
event_buffer_read()
读取缓存事件中的数据
event_buffer_set_callback()
给缓存的事件设置或重置回调hansh函数
event_buffer_timeout_set()
给一个缓存的事件设定超时的读写时间
event_buffer_watermark_set
设置读写事件的水印标记
event_buffer_write()
向缓存事件中写入数据
event_add()
向指定的设置中添加一个执行事件
event_del()
从设置的事件中移除事件
event_free()
清空事件句柄
event_new()
创建一个新的事件
event_set()
准备想要在event_add中添加事件
5、 Select/poll模型
如果你使用sockets extension,这里有socket_select()、stream_select().对于大数应用程序来说,socket_select()、stream_select()已经是足够好的系统调用接口。
6、 epoll/kqueue模型
<?php
function print_line($fd, $events, $arg)
{
static $max_requests = 0;
$max_requests++;
if ($max_requests == 10) {
// exit loop after 10 writes
event_base_loopexit($arg[1]);
}
echo fgets($fd);
}
// create base and event
$base = event_base_new();
$event = event_new();
$fd = STDIN;
// set event flags
event_set($event, $fd, EV_READ | EV_PERSIST, "print_line", array($event, $base));
// set event base
event_base_set($event, $base);
// enable event
event_add($event);
// start event loop
event_base_loop($base);
参考:
[1] http://blog.csdn.net/sparkliang/article/details/4957667
[2] http://blog.csdn.net/laoyi19861011/article/details/6539244
[3] http://blog.csdn.net/laoyi19861011/article/details/6537859
[4] http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html
[5] http://www.ooso.net/archives/607
[6] http://blog.csdn.net/vaal_water/article/details/6968695
[7] http://blog.csdn.net/shagoo/article/details/6396089
[8] http://blog.si.kz/index.php/2010/02/03/libevent-for-php
[9] http://www.ibm.com/developerworks/cn/aix/library/au-libev/index.html
[10] https://github.com/kakserpom/phpdaemon
[11] http://www.cnblogs.com/imvkmark/archive/2011/12/21.html
[12] http://www.oschina.net/question/12_15837
PHP中的Libevent学习的更多相关文章
- libevent学习之二:Windows7(Win7)下编译libevent
Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...
- 【传智播客】Libevent学习笔记(一):简介和安装
目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...
- JS中childNodes深入学习
原文:JS中childNodes深入学习 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <ti ...
- libevent学习总结
1. 信息隐藏:看*-internal.h文件 如bufferevent_private结构体在bufferevent_async.c中使用时: static inline struct buffer ...
- CNCC2017中的深度学习与跨媒体智能
CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...
- 图解BERT(NLP中的迁移学习)
目录 一.例子:句子分类 二.模型架构 模型的输入 模型的输出 三.与卷积网络并行 四.嵌入表示的新时代 回顾一下词嵌入 ELMo: 语境的重要性 五.ULM-FiT:搞懂NLP中的迁移学习 六.Tr ...
- python中confIgparser模块学习
python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...
- Scala中的类学习
Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...
- Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一
Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...
随机推荐
- 测试秒杀新版本3.5 stieserver cms
EXP: 直接访问UserCenter/login.aspx 用户名处输入: 123′insert into bairong_Administrator([UserName],[Password],[ ...
- js 扩展Array支持remove方法
/* * 方法:Array.remove(dx) 通过遍历,重构数组 * 功能:删除数组元素. * 参数:dx删除元素的下标. */ Array.prototype.remove = function ...
- javascript 技巧
1.将arguments转化为数组函数中的预定义变量arguments并非一个真正的数组,而是一个类似数组的对象. 它具有length属性,但是没有slice, push, sort等函数,那么如何使 ...
- 【必备】史上最全的浏览器 CSS & JS Hack 手册(转)
浏览器渲染页面的方式各不相同,甚至同一浏览器的不同版本(“杰出代表”是 IE)也有差异.因此,浏览器兼容成为前端开发人员的必备技能.如果有一份浏览器 Hack 手册,那查询起来就方便多了.这篇文章就向 ...
- Android RecyclerView 使用完全解析
概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我 ...
- NOIP2014感想
NOIP2014转眼就结束了,让人不由感慨时间之快,仿佛几天前还是暑假,几天后就已经坐在考场里了. 从暑假8月开始写博客,发了一些解题报告什么的,但这篇文章不再会是“题目大意 & 解题过程 & ...
- HTTP Referer 防外链
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理. if (Req ...
- Linux学习 : 裸板调试 之 配置使用NAND FLASH
关于NAND FLASH的结构是以页为单位写,以块为单位来擦除: 1Gb 为大页 page=2048Kb BLOCK=128K 512Mb 为小页 page=512byte ...
- 2014年4月份第2周51Aspx源码发布详情
HFC代码转化工具源码 2014-4-8 [VS2010]源码描述:HFC代码转化工具源码 1.主要实现HTML代码转化为C#或者JS代码,为我们平时编码节省时间. 2.把代码复制到面板上,通过右键 ...
- 《Java中方法的重写》
//方法的重写 /* 注意:方法的重写要遵循“两同两小一大”规则 “两同”即方法名相同.形参列表相同: “两小”(1)指的是子类方法返回值类型比父类方法的返回值类型更小或相等,[什么意思?] (2)子 ...