在线文档教程
PHP
事件 | Event

EventBufferEvent::connect

EventBufferEvent::connect

(PECL event >= 1.2.6-beta)

EventBufferEvent :: connect - 将缓冲区事件的文件描述符连接到给定的地址或 UNIX 套接字

描述

public bool EventBufferEvent::connect ( string $addr )

将缓冲区事件的文件描述符连接到给定地址(可选地使用端口)或 UNIX 域套接字。

如果套接字未分配给缓冲区事件,则此函数会分配一个新的套接字并使其在内部处于非阻塞状态。

要解析 DNS 名称(异步),请使用 EventBufferEvent :: connectHost()方法。

参数

addr

应包含带可选端口号的 IP 地址或 UNIX 域套接字的路径。可识别的格式是:

[IPv6Address]:port [IPv6Address] IPv6Address IPv4Address:port IPv4Address unix:path

请注意,'unix:' 前缀目前不区分大小写。

返回值

TRUE成功返回。否则FALSE

例子

示例#1 EventBufferEvent :: connect()示例

<?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(

上面的例子会输出类似于:

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

示例#2连接到大概由服务器提供服务的 UNIX 域套接字,从服务器读取响应并将其输出到控制台

<?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() - 通过可选的异步 DNS 解析连接到主机名

← EventBufferEvent::close

EventBufferEvent::connectHost →