(PECL event >= 1.2.6-beta)
Connect 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.
Parameters:
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
'unix:'
Returns:
Returns TRUE
on success. Otherwise FALSE
.
Examples:
EventBufferEvent::connect() example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <?php /* * 1. Connect to 127.0.0.1 at port 80 * by means of EventBufferEvent::connect(). * * 2. Request /index.cphp via HTTP/1.0 * using the output buffer. * * 3. Asyncronously read the response and print it to stdout. */ /* Read callback */ function readcb( $bev , $base ) { $input = $bev ->getInput(); while (( $n = $input ->remove( $buf , 1024)) > 0) { echo $buf ; } } /* Event callback */ 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 , /* use internal socket */ 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" , /* writecb */ NULL, "eventcb" , $base ); $bev ->enable(Event::READ | Event::WRITE); echo "step 3\n" ; /* Send request */ $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" ); } /* Connect to the host syncronously. * We know the IP, and don't need to resolve DNS. */ if (! $bev ->connect( "127.0.0.1:80" )) { exit ( "Can't connect to host\n" ); } /* Dispatch pending events */ $base ->dispatch(); |
The above example will output something similar to:
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-gentoo sdfsdfsf Closing Done
Connect to UNIX domain socket which presumably is served by a server, read response from the server and output it to the console
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <?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(); ?> |
The above example will output something similar to:
Received 5 bytes ----- data ---- 5: test
See also:
Please login to continue.