文字

EventBufferEvent::connect

(PECL event >= 1.2.6-beta)

EventBufferEvent::connectConnect buffer event's file descriptor to given address or UNIX socket

说明

public bool EventBufferEvent::connect ( string $addr )

Connect buffer event's file descriptor to given address(optionally with port), or a UNIX domain socket.

If socket is not assigned to the buffer event, this function allocates a new socket and makes it non-blocking internally.

To resolve DNS names(asyncronously), use EventBufferEvent::connectHost() method.

参数

addr

Should contain an IP address with optional port number, or a path to UNIX domain socket. Recognized formats are:

[IPv6Address]:port
[IPv6Address]
IPv6Address
IPv4Address:port
IPv4Address
unix:path
Note, 'unix:' prefix is currently not case sensitive.

返回值

Returns TRUE on success. Otherwise FALSE .

范例

Example #1 EventBufferEvent::connect() example

<?php



function  readcb ( $bev $base ) {
    
$input  $bev -> getInput ();

    while ((
$n  $input -> remove ( $buf 1024 )) >  0 ) {
        echo 
$buf ;
    }
}


function  eventcb ( $bev $events $base ) {
    if (
$events  EventBufferEvent :: CONNECTED ) {
        echo 
"Connected.\n" ;
    } elseif (
$events  & ( EventBufferEvent :: ERROR  EventBufferEvent :: EOF )) {
        if (
$events  EventBufferEvent :: ERROR ) {
            echo 
"DNS error: " $bev -> getDnsErrorString (),  PHP_EOL ;
        }

        echo 
"Closing\n" ;
        
$base -> exit ();
        exit(
"Done\n" );
    }
}

$base  = new  EventBase ();

echo 
"step 1\n" ;
$bev  = new  EventBufferEvent ( $base   NULL ,
    
EventBufferEvent :: OPT_CLOSE_ON_FREE  EventBufferEvent :: OPT_DEFER_CALLBACKS );
if (!
$bev ) {
    exit(
"Failed creating bufferevent socket\n" );
}

echo 
"step 2\n" ;
$bev -> setCallbacks ( "readcb"   NULL "eventcb" $base );
$bev -> enable ( Event :: READ  Event :: WRITE );

echo 
"step 3\n" ;

$output  $bev -> getOutput ();
if (!
$output -> add (
    
"GET /index.cphp HTTP/1.0\r\n" .
    
"Connection: Close\r\n\r\n"
)) {
    exit(
"Failed adding request to output buffer\n" );
}


if (! $bev -> connect ( "127.0.0.1:80" )) {
    exit(
"Can't connect to host\n" );
}


$base -> dispatch ();

以上例程的输出类似于:

step 1
step 2
step 3
Connected.
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Sat, 09 Mar 2013 10:06:58 GMT
Content-Type: text/html; charset=utf-8
Connection: close
X-Powered-By: PHP/5.4.11--pl2-gentoosdfsdfsf
Closing
Done

Example #2 Connect to UNIX domain socket which presumably is served by a server, read response from the server and output it to the console

<?php
class  MyUnixSocketClient  {
    private 
$base $bev ;

    function 
__construct ( $base $sock_path ) {
        
$this -> base  $base ;
        
$this -> bev  = new  EventBufferEvent ( $base NULL EventBufferEvent :: OPT_CLOSE_ON_FREE ,
            array (
$this "read_cb" ),  NULL , array ( $this "event_cb" ));

        if (!
$this -> bev -> connect ( "unix: $sock_path " )) {
            
trigger_error ( "Failed to connect to socket ` $sock_path '" E_USER_ERROR );
        }

        
$this -> bev -> enable ( Event :: READ );
    }

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

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

    function 
read_cb ( $bev $unused ) {
        
$in  $bev -> input ;

        
printf ( "Received %ld bytes\n" $in -> length );
        
printf ( "----- data ----\n" );
        
printf ( "%ld:\t%s\n" , (int)  $in -> length $in -> pullup (- 1 ));

        
$this -> bev -> free ();
        
$this -> bev  NULL ;
        
$this -> base -> exit ( NULL );
    }

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

        if (
$events  & ( EventBufferEvent :: EOF  EventBufferEvent :: ERROR )) {
            
$bev -> free ();
            
$bev  NULL ;
        } elseif (
$events  EventBufferEvent :: CONNECTED ) {
            
$bev -> output -> add ( "test\n" );
        }
    }
}

if (
$argc  <=  1 ) {
    exit(
"Socket path is not provided\n" );
}
$sock_path  $argv [ 1 ];

$base  = new  EventBase ();
$cl  = new  MyUnixSocketClient ( $base $sock_path );
$cl -> dispatch ();
?>

以上例程的输出类似于:

Received 5 bytes
----- data ----
5:  test

参见

  • EventBufferEvent::connectHost() - Connects to a hostname with optionally asyncronous DNS resolving
上一篇: 下一篇: