頻道欄目
首頁 > 程序開發 > Web開發 > php > 正文
PHP高性能I/O框架Libevent的使用詳解
2018-07-16 10:20:33         來源:qq_42606051的博客  
收藏   我要投稿

Libevent 是一個用C語言編寫的、輕量級的開源高性能I/O框架,支持多種 I/O 多路復用技術: epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定時器和信號等事件;注冊事件優先級。PHP提供了對應的擴展libevent、Event。

libevent擴展很久沒有更新了,僅支持PHP5系列,PHP7雖然有網友fork了 libevent 擴展的源碼進行更新兼容,但是穩定性不好,可能會出現段錯誤,所以PHP7最好使用 Event 擴展。

與libevent擴展不同的是,Event 擴展提供了面向對象的接口,且支持更多特性。

libevent擴展

系統需要先安裝 Libevent 庫:

yum install libevent-dev

然后安裝PHP擴展。

PHP5安裝:

pecl install libevent-0.1.0

PHP7安裝(不穩定):

git clone https://github.com/expressif/pecl-event-libevent.git
cd pecl-event-libevent
phpize
./configure
make && sudo make install

注:后面的代碼示例均使用的php5.6+libevent-0.1.0環境。

基本使用

下面的例子實現了一個單進程的TCP server,基于libevent實現I/O復用,達到高性能。

libevent_tcp_server.php

我們先運行代碼:

$ php libevent_tcp_server.php
waiting client...
start run...

客戶端使用telnet:

$ telnet 127.0.0.1 9201
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello server!

代碼里面我加了很多注釋,基本上能看明白。需要注意的是:

1、event_base是全局的,只需要創建一次,后續都是event的設置和添加。

2、event_set的回調函數有三個參數,分別是$fd,$events,$arg。也就是 event_set 函數的$fd,$events,$arg參數。arg 如果需要多個,可以為數組。fd參數實際是保存的客戶端連接,是個resource。events參數支持下列這些常量:

EV_TIMEOUT: 超時。利用事件可以實現定時器

EV_READ: 只要網絡緩沖中還有數據,回調函數就會被觸發

EV_WRITE: 只要塞給網絡緩沖的數據被寫完,回調函數就會被觸發

EV_SIGNAL: POSIX信號量

EV_PERSIST: 不指定這個屬性的話,回調函數被觸發后事件會被刪除

EV_ET: Edge-Trigger邊緣觸發

使用event_buffer

libevent還提供了event_buffer_系列函數。手冊里的解釋是:Libevent在基礎的API里提供了一層抽象層,使用 buffered event ,我們無序手動處理I/O。估計是對性能的提升。

示例:

libevent_buffer_tcp_server.php

注釋我都寫了,相比前一個例字,主要有3個地方不同:

1、ev_accept里設置read事件全換成了待buffer的函數;

2、ev_read回調接收參數為2個;

3、ev_read回調里讀取消息使用event_buffer_read,而不是fread。另外增加了ev_write,ev_error回調。

定時器

libevent提供了event_timer_*系列函數,實現一次性定時器,精度微秒。

libevent_timer.php

 5){
  event_timer_del($args[1]); //刪除定時器
 }
}

$base = event_base_new();
$ev_timer = event_timer_new();
event_timer_set($ev_timer, 'ev_timer', [$TIME_INTVAL, $ev_timer]);
event_base_set($ev_timer, $base);
event_timer_add($ev_timer, $TIME_INTVAL);//單位微秒

event_base_loop($base);

上面的例子實現了每1秒執行一次回調函數。

使用event_*系列函數也可以實現:
libevent_timer2.php

 5){
  event_timer_del($args[1]);
 }
}

$base = event_base_new();
$event = event_new();
event_set($event, 0, EV_TIMEOUT, 'ev_timer', [$TIME_INTVAL, $event]);
event_base_set($event, $base);
event_add($event, $TIME_INTVAL);

event_base_loop($base);

可以看出,event_timer_*系列函數是對event_*系列函數EV_TIMEOUT事件的包裝。

總結

event_*系列函數基本上可以分為上面三大類。還有幾個函數沒有提到,大家看手冊就能了解。

點擊復制鏈接 與好友分享!回本站首頁
上一篇:使用php soap出現調用問題的簡單分析
下一篇:BOM是什么?php讀取文本文件把bom讀入數組的情況分析
相關文章
圖文推薦
點擊排行

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

加拿大28火车判定方法