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 →