摘要:是一個用語言編寫的輕量級的開源高性能框架,支持多種多路復用技術和等支持,定時器和信號等事件注冊事件優(yōu)先級。定時器提供了系列函數,實現一次性定時器,精度微秒。
Libevent 是一個用C語言編寫的、輕量級的開源高性能I/O框架,支持多種 I/O 多路復用技術: epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定時器和信號等事件;注冊事件優(yōu)先級。PHP提供了對應的擴展 libevent、 Event 。
libevent擴展很久沒有更新了,僅支持PHP5系列,PHP7雖然有網友fork了 libevent 擴展的源碼進行更新兼容,但是穩(wěn)定性不好,可能會出現段錯誤,所以PHP7最好使用 Event 擴展。
與libevent擴展不同的是,Event 擴展提供了面向對象的接口,且支持更多特性。
libevent擴展libevent地址: http://pecl.php.net/package/l...
libevent文檔: http://docs.php.net/libevent
系統需要先安裝 Libevent 庫:
yum install libevent-dev
然后安裝PHP擴展。
PHP5安裝:
pecl install libevent-0.1.0
PHP7安裝(不穩(wěn)定):
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環(huán)境。
基本使用下面的例子實現了一個單進程的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是全局的,只需要創(chuàng)建一次,后續(xù)都是event的設置和添加。
2、event_set 的回調函數有三個參數,分別是$fd, $events, $arg。也就是 event_set 函數的$fd, $events, $arg參數。arg 如果需要多個,可以為數組。fd參數實際是保存的客戶端連接,是個resource。events參數支持下列這些常量:EV_TIMEOUT: 超時。利用事件可以實現定時器
EV_READ: 只要網絡緩沖中還有數據,回調函數就會被觸發(fā)
EV_WRITE: 只要塞給網絡緩沖的數據被寫完,回調函數就會被觸發(fā)
EV_SIGNAL: POSIX信號量
EV_PERSIST: 不指定這個屬性的話,回調函數被觸發(fā)后事件會被刪除
EV_ET: Edge-Trigger邊緣觸發(fā)
3、ev_accept 回調里面,后面幾行如果不設置,會出現異常。目前沒有找到好的解釋。
使用event_buffer
4、ev_read 回調里面,刪除客戶端連接使用 unset也可以達到同樣效果,這個和第3點一樣,沒有找到好的解釋。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秒執(zhí)行一次回調函數。
使用event_*系列函數也可以實現:
libevent_timer2.php5){ 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_*系列函數基本上可以分為上面三大類。還有幾個函數沒有提到,大家看手冊就能了解。
(未完待續(xù))
歡迎關注公眾號及時獲取最新文章推送!
推薦!每月僅需$2.5,即可擁有配置SSD的VPS!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/28970.html
摘要:而多路復用無需等待任務完成,而是將所有任務維護在一個組中,在等待過程中線程可以去處理其他的任務,當某個任務完成后,再去操作該操作符。而目前僅有的調優(yōu)方案是調整因子,讓的大小盡可能的接近,減少空間的浪費。 0x00 Memcached簡述 Memcached是一套高性能的分布式內存對象緩存系統,用于在動態(tài)系統中減少數據庫負載,提升性能。 0x01 Memcached特性 基于libev...
摘要:原文地址正如標題所言,顫顫抖抖開篇。于是只能是你自己,把單子上的個快遞逐次和收到的對比一遍,然后對比完畢后再把這個單子給了阿梅,然后阿梅繼續(xù)等。剃光頭前的阿梅,就是,不敢正眼看老板娘一眼。剃光頭后的阿梅,就是,可徒手接魔鬼隊的死亡之球。 [原文地址:https://blog.ti-node.com/blog...] 正如標題所言,顫顫抖抖開篇epoll。顫顫抖抖的原因大概也就是以前幾乎...
摘要:哈希的結果應能夠保證原有已分配的內容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實現 標簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個分布式,開源的數據存儲引擎。memcach...
摘要:哈希的結果應能夠保證原有已分配的內容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實現 標簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個分布式,開源的數據存儲引擎。memcach...
閱讀 2623·2021-11-16 11:40
閱讀 3421·2021-11-08 13:26
閱讀 890·2021-10-28 09:32
閱讀 3545·2021-09-13 10:26
閱讀 816·2019-08-30 15:55
閱讀 791·2019-08-30 15:44
閱讀 1917·2019-08-30 15:44
閱讀 1764·2019-08-30 13:48