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学习的更多相关文章

  1. libevent学习之二:Windows7(Win7)下编译libevent

    Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...

  2. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  3. JS中childNodes深入学习

    原文:JS中childNodes深入学习 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <ti ...

  4. libevent学习总结

    1. 信息隐藏:看*-internal.h文件 如bufferevent_private结构体在bufferevent_async.c中使用时: static inline struct buffer ...

  5. CNCC2017中的深度学习与跨媒体智能

    CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...

  6. 图解BERT(NLP中的迁移学习)

    目录 一.例子:句子分类 二.模型架构 模型的输入 模型的输出 三.与卷积网络并行 四.嵌入表示的新时代 回顾一下词嵌入 ELMo: 语境的重要性 五.ULM-FiT:搞懂NLP中的迁移学习 六.Tr ...

  7. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  8. Scala中的类学习

    Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...

  9. Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一

    Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...

随机推荐

  1. tiny_cnn 阅读(1)

    从今天起, 我会每天把阅读tiny_cnn的阅读心得提交到博客园中希望大家在这个平台上可以多多交流: 关于如果阅读代码? 抓住重点,忽略细节 首先打开从github上下载的文件: 通过csdn和网上搜 ...

  2. Eclipse中Java项目转换为Web项目

    刚创建完的Java Project是这样的 右键项目名,找到这个地方 修改下方的 Default output folder 为 Vehicle-Report/WebContent/WEB-INF/c ...

  3. python无意中发现的

    http://www.zhihu.com/question/37904398?sort=created&page=2 >>> a = [[1,2],[3,4],[5,6,7] ...

  4. 关于ecshop的那些故事

    1.php下foreach()错误提示Warning: Invalid argument supplied for foreach() 错误提示:Warning: Invalid argument s ...

  5. NET中的规范标准注释(一) -- XML注释标签讲解

    一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来,并作进一步的处理为外部文档. 这篇文章将展示如何使用这 ...

  6. SQLite常用命令

    1.点命令 [退出SQLite提示符] .quit .exit [帮助] .help [显示设置] .show 2.语法 [结束符] : --一行语句的结束以分号(:)结尾 [CREATE TABLE ...

  7. OC基础--简介

    OC简介: 1986年,BradCox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言. 1985年,被赶出苹果公司的Steve Jobs成立了NeXT ...

  8. java基础之 内部类

    Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...

  9. WPF之MVVM模式讲解

    WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 恰当的模式可以让我们轻松达到“高内聚 ...

  10. iOS学习之NSPredictae及搜索框的实现

    NSPredicate Predicate 即谓词逻辑, Cocoa框架中的NSPredicate用于查询,作用是从数据堆中根据条件进行筛选.计算谓词之后返回的结果永远为BOOL类型的值,当程序使用谓 ...