在根據網上不少資料介紹 libevent 如何使用或者代碼分析;不過,大多數都是C 方面一些底層介紹。php
在 php 層面上介紹相關應用相對不多,不知道是否在 php 使用 libevent 組件的自己就比較少. 並且網主記載使用例子很是簡單. 好啦, 我就長話短說,下面就直接上代碼了。服務器
public function Start(){ $this->server_sock = stream_socket_server ('tcp://0.0.0.0:'.$port, $errno, $errstr); @stream_set_blocking($this->server_sock, 0); //設置事件監聽,監聽到服務器端socket可讀,則有鏈接請求 event_set($this->server_event, $this->server_sock, EV_READ | EV_PERSIST, array($this,'ev_accept'), NULL); event_base_set($this->server_event, $this->base_event); event_add($this->server_event); event_base_loop($this->base_event); }
注意: 在設置事件監聽上,第四個參數. 我使用 一個Array 來作. 在網上不少例子都是使用 function 名稱. 但這樣作不利於業務邏輯編寫,因此,這裏做出了一些修改.socket
private function ev_accept($server_socket, $events) { //接受鏈接 $accept_socket = @stream_socket_accept($server_socket); $accept_id = (int)$accept_socket; //增長socket timeout設定 stream_set_timeout($accept_socket, 2); @stream_set_blocking($accept_socket , 0); $accept_ip = @stream_socket_get_name($accept_socket, true); //新的事件監聽,監聽客戶端發生的事件 $client_event = event_new(); event_set($client_event, $accept_socket, EV_READ | EV_PERSIST, array($this,'ev_read'), NULL); event_base_set($client_event,$this->base_event); event_add($client_event); //加入事件監聽組 $this->client_sock[$accept_id] = $accept_socket; //加入到服務器端上客戶端socket列表 $this->client_event[$accept_id] = $client_event; //加入到服務端上,客戶端socket時間監聽列表 }
注: 這個部分主要都是設定服務端接收一個Socket 鏈接的狀況下, 服務端須要處理一些必要事情.如: 監聽信息流事件,監聽類型以及有信息流觸發的處理方法. 這些事情都是對應每一個Socket 來作相關處理.tcp
private function ev_read($client_socket,$events){ $client_id = (int)$client_socket; $read = ''; $read = fread($client_socket, 2048)) if($read !== false && $read !=''){ //這裏你就能夠處理你讀取的信息流 } else{ echo ' SOCKET CLOSE BY CLIENT ' ; //服務端釋放對應用戶的內存塊 unset($this->client_sock[$client_id],$this->client_event[$client_id]); } }
展現的代碼相對比較簡單,但跌跌碰碰用了很多時間進行摸索.總的來說,這樣構建PHP 服務端會比用純Socket組件要穩定. oop