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 →
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com