php libevent 功能與使用方法詳解
本文例項講述了php libevent 功能與使用方法。分享給大家供大家參考,具體如下:
libevent是一個基於事件驅動的高效能網路庫。支援多種 I/O 多路複用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;支援 I/O,定時器和訊號等事件;註冊事件優先順序。
常量如下:
值 | 常量名 | 含義 |
---|---|---|
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_free() 釋放資源,這不能銷燬繫結事件 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() 給快取的事件設定或重置回撥函式 event_buffer_timeout_set() 給一個快取的事件設定超時的讀寫時間 event_buffer_watermark_set 設定讀寫事件的水印標記 event_buffer_write() 向快取事件中寫入資料 event_add() 向指定的設定中新增一個執行事件 event_del() 從設定的事件中移除事件 event_free() 清空事件控制代碼 event_new() 建立一個新的事件 event_set() 準備想要在event_add中新增事件
例1如下:
<?php //建立和初始化新的事件庫 $base = event_base_new(); //建立並返回一個新的事件資源 $event = event_new(); //準備一個事件 event_set($event,EV_TIMEOUT,function() { echo "run..."; }); //關聯事件到事件庫 event_base_set($event,$base); //新增事件 event_add($event,5000000); //根據指定的事件庫來處理事件迴圈 event_base_loop($base);
上述程式碼在等待了5秒後打印出run...後程序結束。
我們把上述程式碼修改一下:
<?php //建立和初始化新的事件庫 $base = event_base_new(); //建立並返回一個新的事件資源 $event = event_new(); //準備一個事件 event_set($event,EV_TIMEOUT | EV_PERSIST,function() { echo "run...\r\n"; }); //關聯事件到事件庫 event_base_set($event,1000000); //根據指定的事件庫來處理事件迴圈 event_base_loop($base);
上述程式碼會每隔1秒鐘打印出run...,只是因為我們在event_set時使用了EV_PERSIST,表示該事件是一個持久的。
例2如下:
<?php function printContent($fd,$events,$args) { $data = trim(fgets($fd)); echo "input: ",$data,"\r\n"; } //建立和初始化新的事件庫 $base = event_base_new(); //建立並返回一個新的事件資源 $event = event_new(); //這裡把標準輸入流傳入到函式printContent中 $fd = STDIN; event_set($event,$fd,EV_PERSIST | EV_TIMEOUT,'printContent',array($event,$base)); //關聯事件到事件庫 event_base_set($event,1000000); //根據指定的事件庫來處理事件迴圈 event_base_loop($base);
程式碼每隔1秒鐘,會從標準輸入中讀取使用者輸入的內容,再打印出來。
例3如下:
<?php //建立套接字 $socket = stream_socket_server('tcp://0.0.0.0:8888',$errno,$errstr); //設定資源流為非阻塞模式 stream_set_blocking($socket,0); //建立和初始化新的事件庫 $base = event_base_new(); //建立並返回一個新的事件資源 $event = event_new(); //準備一個事件 event_set($event,$socket,EV_PERSIST | EV_READ,'accept',$base); //關聯事件到事件庫 event_base_set($event,$base); //新增事件 event_add($event); //根據指定的事件庫來處理事件迴圈 event_base_loop($base); function accept($socket,$base) { //獲取客戶端連線後的socket $client = stream_socket_accept($socket); //設定該socket為非阻塞模式 stream_set_blocking($client,0); //建立一個新的快取事件 $buffer = event_buffer_new($client,'read',NULL,'error',$client); //關聯快取事件到事件庫 event_buffer_base_set($buffer,$base); //快取事件超時時間 event_buffer_timeout_set($buffer,30,30); //設定快取事件讀寫的水印標記 event_buffer_watermark_set($buffer,EV_READ,0xffffff); //設定快取事件的優先順序 event_buffer_priority_set($buffer,10); //啟用快取事件 event_buffer_enable($buffer,EV_READ | EV_PERSIST); //這裡好像必需把$buffer賦給一個全域性的變數 $GLOBALS['_'] = $buffer; } function read($buffer,$client) { //從快取事件中讀取資料 while ($read = event_buffer_read($buffer,256)) { } //給連線的socket客戶端寫入資料 fwrite($client,date('Y-m-d H:i:s')); error($buffer,'',$client); } function error($buffer,$error,$client) { //禁用一個快取事件 event_buffer_disable($buffer,EV_READ | EV_WRITE); //釋放快取事件 event_buffer_free($buffer); //關閉客戶端socket fclose($client); }
附:linux 下 php 安裝 libevent
一、安裝libevent庫
1、到libevent官網下載安裝原始碼
http://libevent.org/
如:libevent-2.0.22-stable.tar.gz
2、解壓原始碼包
> tar zxvf libevent-2.0.22-stable.tar.gz > cd libevent-2.0.22-stable
3、configure
> ./configure --prefix=/usr/local/libevent
4、make && make install
> make > make install
二、安裝php的libevent擴充套件
1、下載地址如下:
http://pecl.php.net/package/libevent
如:libevent-0.1.0.tgz
2、解壓
> tar zxvf libevent-0.1.0.tgz
3、通過phpize命令生成configure
> /data/nmp/php/bin/phpize
(*如上路徑只作演示,具體視安裝環境而定。)
4、生成好後,執行configure
> ./configure --with-php-config=/data/nmp/php/bin/php-config --with-libevent=/usr/local/libevent
5、make && make install
> make > make install
6、修改php.ini檔案,新增如下
extension=libevent.so
7、重啟伺服器
更多關於PHP相關內容感興趣的讀者可檢視本站專題:《PHP擴充套件開發教程》、《PHP網路程式設計技巧總結》、《php curl用法總結》、《PHP陣列(Array)操作技巧大全》、《PHP資料結構與演算法教程》、《php程式設計演算法總結》及《php字串(string)用法總結》
希望本文所述對大家PHP程式設計有所幫助。