PHP已經成為了很多Web開發者和企業的首選語言。PHP編寫的Web應用程序,往往需要異步、并發、高性能、高可擴展等強大特性。libevent是這個環境下開發人員的不二之選。
libevent是一個開源的C語言庫,簡單易用,性能極佳。它的適用范圍十分廣泛,并被廣泛地用于網絡服務器、代理、負載均衡器等底層開發領域。而在PHP開發領域,libevent是一個非常重要的工具庫之一。下面,我們重點介紹一下libevent在PHP編程中的使用方法及應用場景。
一、環境安裝
因為libevent是一個C語言類庫,因此,在PHP中使用它,需要先進行環境安裝。首先,需要安裝PHP的PIE擴展,以支持針對libevent進行異步IO操作。
在Linux環境下,可以直接通過yum等方式,安裝必要的依賴。
# yum -y install libevent-devel gcc-c++ php-pear php-psr
然后,可以使用pecl安裝event擴展:
# pecl install event
二、基礎用法
home頁面的來源:
//PHP
$data = array("data1","data2","data3","data4","data5","data6","data7","data8","data9","data10");
foreach ($data as $v) {
file_get_contents('http://localhost:8080?a='.$v);
}
同時開啟一個服務端程序,用于接收請求,并返回接收到的參數。
// PHP
$base = event_base_new();
$http = event_new();
if ( ! event_http_bind($http, "0.0.0.0", 8080) )
{
exit("failed bind host.");
}
function recv_callback($fd, $event, $arg) {
$s = event_buffer_read($arg, 1024);
echo $s.'-recv
';
if ( ! empty($s) )
{
event_buffer_write($arg, "recv:" . $s, strlen($s) + 5);
}
}
$event_buffer = event_buffer_new(STDIN, "recv_callback", NULL, NULL, $base);
event_buffer_base_set($event_buffer, $base);
event_buffer_enable($event_buffer, EV_READ | EV_PERSIST);
event_set($http, 0, EV_READ | EV_PERSIST, function($x, $flag, $arg) {
$base = $event = $arg[0];
$fd = event_http_accept($event);
event_buffer_new($fd, NULL, NULL, NULL, $base);
}, array($base, $http));
event_base_loop($base);
以上是一個簡單的用例,這里我們來看一下怎么使用libevent來實現異步HTTP請求。下面是一個獲取大量數據的curl同步代碼。
// PHP
foreach ($urls as $i =>$url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
curl_close($ch);
$results[$i] = $out;
}
使用libevent,我們改寫一下上面的同步代碼,來實現異步的HTTP請求。
// PHP
$base = event_base_new();
$mh = curl_multi_init();
foreach ($urls as $i =>$url) {
$ch[$i] = curl_init($url);
curl_setopt($ch[$i], CURLOPT_HEADER, 0);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch[$i]);
}
// 這里event_new執行的時候,第2個參數傳false即可
$event_base = event_base_new();
$event = event_new();
event_set($event, curl_multi_socket_all($mh), EV_READ | EV_PERSIST, function($ch, $flag, $arg) { }, $mh);
event_base_set($event, $event_base);
event_add($event);
while ($active && ($mrc = curl_multi_exec($mh, $active)) >= 0) {
if ($mrc !== CURLM_OK) {
break;
}
event_base_loop($event_base, EVLOOP_ONCE);
}
for ($i = 0; $i< count($urls); $i++)
{
$out = curl_multi_getcontent($ch[$i]);
curl_multi_remove_handle($mh, $ch[$i]);
$results[$i] = $out;
}
curl_multi_close($mh);
這段柿子tcl_map索引掃一掃離線解析 http://www.opensourcemap.com/docs/tcl/tcl_map.html 包含兩個部分。我們首先通過curl_multi_init函數初始化一個curl多線程句柄,然后通過curl_multi_add_handle函數添加cURL句柄。然后,再通過事件循環,設置回調函數,監聽消息是否到達。最后,緩存請求結果,通過curl_multi_remove_handle函數釋放cURL句柄,然后關閉$mh句柄。
在實際使用過程中,libevent確實有幫助到開發者,但是需要注意的是,如果初學者想要應用libevent開發PHP應用程序,還需要耐心學習,真正理解其在底層開發領域中的優秀特性及用法。
網站導航
- zblogPHP模板zbpkf
- zblog免費模板zblogfree
- zblog模板學習zblogxuexi
- zblogPHP仿站zbpfang