©
本文档使用
php.cn手册 发布
(PECL event >= 1.2.6-beta)
EventBufferEvent::connect — Connect buffer event's file descriptor to given address or UNIX socket
$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
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