文字

EventListener::__construct

(PECL event >= 1.2.6-beta)

EventListener::__constructCreates new connection listener associated with an event base

说明

public EventListener::__construct ( EventBase $base , callable $cb , mixed $data , int $flags , int $backlog , mixed $target )

Creates new connection listener associated with an event base.

参数

base

Associated event base.

cb

A callable that will be invoked when new connection received.

data

Custom user data attached to cb .

flags

Bit mask of EventListener::OPT_* constants. See EventListener constants .

backlog

Controls the maximum number of pending connections that the network stack should allow to wait in a not-yet-accepted state at any time; see documentation for your system’s listen function for more details. If backlog is negative, Libevent tries to pick a good value for the backlog ; if it is zero, Event assumes that listen is already called on the socket( target )

target

May be string, socket resource, or a stream associated with a socket. In case if target is a string, the string will be parsed as network address. It will be interpreted as a UNIX domain socket path, if prefixed with 'unix:' , e.g. 'unix:/tmp/my.sock' .

返回值

Returns EventListener object representing the event connection listener.

更新日志

版本 说明
1.5.0 UNIX domain sockets' support added.

范例

Example #1 EventListener::__construct() example

<?php


class  MyListenerConnection  {
    private 
$bev $base ;

    public function 
__destruct () {
        
$this -> bev -> free ();
    }

    public function 
__construct ( $base $fd ) {
        
$this -> base  $base ;

        
$this -> bev  = new  EventBufferEvent ( $base $fd EventBufferEvent :: OPT_CLOSE_ON_FREE );

        
$this -> bev -> setCallbacks (array( $this "echoReadCallback" ),  NULL ,
            array(
$this "echoEventCallback" ),  NULL );

        if (!
$this -> bev -> enable ( Event :: READ )) {
            echo 
"Failed to enable READ\n" ;
            return;
        }
    }

    public function 
echoReadCallback ( $bev $ctx ) {
        
// Copy all the data from the input buffer to the output buffer
        
        // Variant #1
        
$bev -> output -> addBuffer ( $bev -> input );

        

        
    
}

    public function 
echoEventCallback ( $bev $events $ctx ) {
        if (
$events  EventBufferEvent :: ERROR ) {
            echo 
"Error from bufferevent\n" ;
        }

        if (
$events  & ( EventBufferEvent :: EOF  EventBufferEvent :: ERROR )) {
            
//$bev->free();
            
$this -> __destruct ();
        }
    }
}

class 
MyListener  {
    public 
$base ,
        
$listener ,
        
$socket ;
    private 
$conn  = array();

    public function 
__destruct () {
        foreach (
$this -> conn  as & $c $c  NULL ;
    }

    public function 
__construct ( $port ) {
        
$this -> base  = new  EventBase ();
        if (!
$this -> base ) {
            echo 
"Couldn't open event base" ;
            exit(
1 );
        }

        
// Variant #1
        

        // Variant #2
         
$this -> listener  = new  EventListener ( $this -> base ,
             array(
$this "acceptConnCallback" ),  $this -> base ,
             
EventListener :: OPT_CLOSE_ON_FREE  EventListener :: OPT_REUSEABLE , - 1 ,
             
"0.0.0.0: $port " );

        if (!
$this -> listener ) {
            echo 
"Couldn't create listener" ;
            exit(
1 );
        }

        
$this -> listener -> setErrorCallback (array( $this "accept_error_cb" ));
    }

    public function 
dispatch () {
        
$this -> base -> dispatch ();
    }

    
// This callback is invoked when there is data to read on $bev
    
public function  acceptConnCallback ( $listener $fd $address $ctx ) {
        
// We got a new connection! Set up a bufferevent for it. */
        
$base  $this -> base ;
        
$this -> conn [] = new  MyListenerConnection ( $base $fd );
    }

    public function 
accept_error_cb ( $listener $ctx ) {
        
$base  $this -> base ;

        
fprintf ( STDERR "Got an error %d (%s) on the listener. "
            
. "Shutting down.\n" ,
            
EventUtil :: getLastSocketErrno (),
            
EventUtil :: getLastSocketError ());

        
$base -> exit ( NULL );
    }
}

$port  9808 ;

if (
$argc  1 ) {
    
$port  = (int)  $argv [ 1 ];
}
if (
$port  <=  ||  $port  65535 ) {
    exit(
"Invalid port" );
}

$l  = new  MyListener ( $port );
$l -> dispatch ();
?>

用户评论:

[#1] info-phpnet at ch2o dot info [2014-11-11 14:04:51]

Warning EventListener::OPT_CLOSE_ON_FREE is forced when you transmit a "target" string.

The only way to not set EventListener::OPT_CLOSE_ON_FREE is to bind the socket before creating EventListener and use this socekt as "target".

上一篇: 下一篇: