wangbin@2012,1,3php
目錄html
Libevent在php中的應用學習node
一、 Libevent介紹linux
二、 爲何要學習libeventnginx
三、 Php libevent 擴展模塊安裝git
四、 Libevent常量及php函數github
五、 Select/poll模型編程
六、 epoll/kqueue模型windows
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
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;
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
安裝成功
#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中添加事件
若是你使用sockets extension,這裏有socket_select()、stream_select().對於大數應用程序來講,socket_select()、stream_select()已是足夠好的系統調用接口。
<?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