PHP libevent 使用總結

在根據網上不少資料介紹 libevent 如何使用或者代碼分析;不過,大多數都是C 方面一些底層介紹。php

在 php 層面上介紹相關應用相對不多,不知道是否在 php 使用 libevent 組件的自己就比較少. 並且網主記載使用例子很是簡單. 好啦, 我就長話短說,下面就直接上代碼了。服務器

下面爲定義 libevent 監聽端口以及監聽IP

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

下面爲 ev_accept 方法的代碼

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

下面爲 ev_read 方法的代碼

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

相關文章
相關標籤/搜索