国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP之高性能I/O框架:Libevent(一)

klivitamJ / 2111人閱讀

摘要:是一個(gè)用語言編寫的輕量級的開源高性能框架,支持多種多路復(fù)用技術(shù)和等支持,定時(shí)器和信號等事件注冊事件優(yōu)先級。定時(shí)器提供了系列函數(shù),實(shí)現(xiàn)一次性定時(shí)器,精度微秒。

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

libevent擴(kuò)展很久沒有更新了,僅支持PHP5系列,PHP7雖然有網(wǎng)友fork了 libevent 擴(kuò)展的源碼進(jìn)行更新兼容,但是穩(wěn)定性不好,可能會出現(xiàn)段錯(cuò)誤,所以PHP7最好使用 Event 擴(kuò)展。

與libevent擴(kuò)展不同的是,Event 擴(kuò)展提供了面向?qū)ο蟮慕涌冢抑С指嗵匦浴?/p> libevent擴(kuò)展

libevent地址: http://pecl.php.net/package/l...
libevent文檔: http://docs.php.net/libevent

系統(tǒng)需要先安裝 Libevent 庫:

yum install libevent-dev

然后安裝PHP擴(kuò)展。

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)境。

基本使用

下面的例子實(shí)現(xiàn)了一個(gè)單進(jìn)程的TCP server,基于libevent實(shí)現(xiàn)I/O復(fù)用,達(dá)到高性能。

libevent_tcp_server.php


我們先運(yùn)行代碼:

$ 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的設(shè)置和添加。
2、event_set 的回調(diào)函數(shù)有三個(gè)參數(shù),分別是$fd, $events, $arg。也就是 event_set 函數(shù)的$fd, $events, $arg參數(shù)。arg 如果需要多個(gè),可以為數(shù)組。fd參數(shù)實(shí)際是保存的客戶端連接,是個(gè)resource。events參數(shù)支持下列這些常量:

EV_TIMEOUT: 超時(shí)。利用事件可以實(shí)現(xiàn)定時(shí)器

EV_READ: 只要網(wǎng)絡(luò)緩沖中還有數(shù)據(jù),回調(diào)函數(shù)就會被觸發(fā)

EV_WRITE: 只要塞給網(wǎng)絡(luò)緩沖的數(shù)據(jù)被寫完,回調(diào)函數(shù)就會被觸發(fā)

EV_SIGNAL: POSIX信號量

EV_PERSIST: 不指定這個(gè)屬性的話,回調(diào)函數(shù)被觸發(fā)后事件會被刪除

EV_ET: Edge-Trigger邊緣觸發(fā)

3、ev_accept 回調(diào)里面,后面幾行如果不設(shè)置,會出現(xiàn)異常。目前沒有找到好的解釋。
4、ev_read 回調(diào)里面,刪除客戶端連接使用 unset也可以達(dá)到同樣效果,這個(gè)和第3點(diǎn)一樣,沒有找到好的解釋。

使用event_buffer

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

示例:
libevent_buffer_tcp_server.php


注釋我都寫了,相比前一個(gè)例字,主要有3個(gè)地方不同:
1、ev_accept 里設(shè)置read事件全換成了待buffer的函數(shù);
2、ev_read 回調(diào)接收參數(shù)為2個(gè);
3、ev_read 回調(diào)里讀取消息使用 event_buffer_read,而不是fread。另外增加了ev_writeev_error回調(diào)。

定時(shí)器

libevent提供了event_timer_*系列函數(shù),實(shí)現(xiàn)一次性定時(shí)器,精度微秒。

libevent_timer.php

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

$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);

上面的例子實(shí)現(xiàn)了每1秒執(zhí)行一次回調(diào)函數(shù)。

使用event_*系列函數(shù)也可以實(shí)現(xiàn):
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_*系列函數(shù)是對event_*系列函數(shù)EV_TIMEOUT事件的包裝。

總結(jié)

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

(未完待續(xù))


歡迎關(guān)注公眾號及時(shí)獲取最新文章推送!


推薦!每月僅需$2.5,即可擁有配置SSD的VPS!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28970.html

相關(guān)文章

  • 學(xué)習(xí)筆記Memcached原理

    摘要:而多路復(fù)用無需等待任務(wù)完成,而是將所有任務(wù)維護(hù)在一個(gè)組中,在等待過程中線程可以去處理其他的任務(wù),當(dāng)某個(gè)任務(wù)完成后,再去操作該操作符。而目前僅有的調(diào)優(yōu)方案是調(diào)整因子,讓的大小盡可能的接近,減少空間的浪費(fèi)。 0x00 Memcached簡述 Memcached是一套高性能的分布式內(nèi)存對象緩存系統(tǒng),用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能。 0x01 Memcached特性 基于libev...

    imingyu 評論0 收藏0
  • PHP socket初探 --- 顫顫抖抖開篇libevent(

    摘要:原文地址正如標(biāo)題所言,顫顫抖抖開篇。于是只能是你自己,把單子上的個(gè)快遞逐次和收到的對比一遍,然后對比完畢后再把這個(gè)單子給了阿梅,然后阿梅繼續(xù)等。剃光頭前的阿梅,就是,不敢正眼看老板娘一眼。剃光頭后的阿梅,就是,可徒手接魔鬼隊(duì)的死亡之球。 [原文地址:https://blog.ti-node.com/blog...] 正如標(biāo)題所言,顫顫抖抖開篇epoll。顫顫抖抖的原因大概也就是以前幾乎...

    levinit 評論0 收藏0
  • memcached分布式原理與實(shí)現(xiàn)

    摘要:哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實(shí)現(xiàn) 標(biāo)簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個(gè)分布式,開源的數(shù)據(jù)存儲引擎。memcach...

    Ververica 評論0 收藏0
  • memcached分布式原理與實(shí)現(xiàn)

    摘要:哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實(shí)現(xiàn) 標(biāo)簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個(gè)分布式,開源的數(shù)據(jù)存儲引擎。memcach...

    LiuRhoRamen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<