Libevent在php中的应用学习

来源:互联网 发布:条形码标签制作软件 编辑:程序博客网 时间:2024/06/16 19:31
原文地址:Libevent在php中的应用学习作者:木木彡

Libeventphp中的应用学习

wangbin@2012,1,3

目录

Libeventphp中的应用学习

1     Libevent介绍

2     为什么要学习libevent

3     Php libevent扩展模块安装

4     Libevent常量及php函数

5     Selectpoll模型

6     epollkqueue模型

1、 libevent介绍

libevent是一个事件触发的网络库,适用于windowslinuxfreebsd等多种平台,内部使用selectpollepollkqueue等系统调用管理事件机制。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 forknworkermaster process 得到请求后,处理信息发送给worker程序worker处理完后回传给clientMaster 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 newprocess

2、 connection input pthread_create

3、 connection input throw a Event-based array; main process dononblocking things;

 

3Php 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

 

安装成功

 

4Libevent常量及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

#defineEVLOOP_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中添加事件

5Selectpoll模型

如果你使用socketsextension,这里有socket_select()stream_select().对于大数应用程序来说,socket_select()stream_select()已经是足够好的系统调用接口。

6epollkqueue模型

<?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

原创粉丝点击