首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EventBufferEvent::connect

(PECL event >= 1.2.6-beta)

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

描述

代码语言:javascript
复制
public bool EventBufferEvent::connect (  string $addr  )

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

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

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

参数

addr

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

代码语言:javascript
复制
[IPv6Address]:port
[IPv6Address]
IPv6Address
IPv4Address:port
IPv4Address
unix:path

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

返回值

TRUE成功返回。否则FALSE

例子

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

代码语言:javascript
复制
<?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();

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

代码语言:javascript
复制
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 域套接字,从服务器读取响应并将其输出到控制台

代码语言:javascript
复制
<?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();
?>

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

代码语言:javascript
复制
Received 5 bytes
----- data ----
5:  test

也可以看看

  • EventBufferEvent :: connectHost() - 通过可选的异步 DNS 解析连接到主机名

← EventBufferEvent::close

EventBufferEvent::connectHost →

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com