PHP中的Libevent學習

 

wangbin@2012,1,3php

目錄html

Libevent在php中的應用學習node

一、      Libevent介紹linux

二、      爲何要學習libeventnginx

三、      Php libevent 擴展模塊安裝git

四、      Libevent常量及php函數github

五、      Select/poll模型編程

六、      epoll/kqueue模型windows

一、 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 nworkermaster process 獲得請求後,處理信息發送給worker程序worker處理完後回傳給clientMaster process 能夠跟據併發量,來設定worker的數量,n的大小,並monitor(監控)worker的數據,在不足時啓動更多的進程。同nginx原理。

附:Php網絡編程框架

http://code.google.com/p/swoole/downloads/list

二、 爲何要學習libevent

http server能夠說是libevent的經典應用。能夠從libevent當中找到http的標準寫法,非阻塞的http server也就是socket處理與http協議處理纏繞。

學習libevent有助於提高程序設計功力,除了網絡程序設計方面外,Libevent的代碼裏有不少有用的設計技巧和基礎數據結構,好比信息隱藏、函數指針、c語言的多態支持、鏈表和堆等等,都有助於提高自身的程序功力1

對請求的處理的三種類型:

一、  connection input  fork a new process

二、  connection input  pthread_create

三、  connection input throw a Event-based array; main process do nonblocking things;

 

三、 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

 

安裝成功

 

四、 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中添加事件

五、 Select/poll模型

若是你使用sockets extension,這裏有socket_select()、stream_select().對於大數應用程序來講,socket_select()、stream_select()已是足夠好的系統調用接口。

六、 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

相關文章
相關標籤/搜索