(PECL event >= 1.2.6-beta)
EventBufferEvent::connectHost — Conexión a un host
$dns_base
,$hostname
,$port
,$family
= EventUtil::AF_UNSPEC
Resuelve el nombre de host DNS, buscando la dirección del tipo
family
(constante EventUtil::AF_*
).
Si la resolución del nombre falla, la función de retrollamada del evento
será llamada con un evento de error. Si la resolución tiene éxito,
se realizará un intento de conexión, de manera similar a como lo hace el método
EventBufferEvent::connect().
El parámetro dns_base
es opcional.
Puede ser null
, o bien un objeto creado con el método
EventDnsBase::__construct().
Para una resolución de nombre de host asíncrona, pase una fuente de evento de base DNS válida. De lo contrario, la resolución del nombre de host
será bloqueante.
Nota:
EventDnsBase solo está disponible si
Event
está configurado con la opción --with-event-extra (bibliotecaevent_extra
, el soporte de las funcionalidades específicas de libevent incluyendo HTTP, DNS y RPC).
Nota:
EventBufferEvent::connectHost() requiere
libevent-2.0.3-alpha
o posteriores.
dns_base
Objeto EventDnsBase en el caso
donde el DNS debe ser resuelto de manera asíncrona. De lo contrario, null
.
hostname
El nombre de host al cual se intenta realizar la conexión. Los formatos reconocidos son:
www.example.com (hostname) 1.2.3.4 (ipv4address) ::1 (ipv6address) [::1] ([ipv6address])
port
El número del puerto
family
Familia de la dirección.
EventUtil::AF_UNSPEC
,
EventUtil::AF_INET
o
EventUtil::AF_INET6
. Ver las
constantes EventUtil.
Ejemplo #1 Ejemplo con EventBufferEvent::connectHost()
<?php
/* Función de retrollamada de lectura */
function readcb($bev, $base) {
//$input = $bev->input; //$bev->getInput();
//$pos = $input->search("TTP");
$pos = $bev->input->search("TTP");
while (($n = $bev->input->remove($buf, 1024)) > 0) {
echo $buf;
}
}
/* Función de retrollamada del evento */
function eventcb($bev, $events, $base) {
if ($events & EventBufferEvent::CONNECTED) {
echo "Conectado.\n";
} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if ($events & EventBufferEvent::ERROR) {
echo "Error DNS: ", $bev->getDnsErrorString(), PHP_EOL;
}
echo "Cerrando\n";
$base->exit();
exit("Hecho !\n");
}
}
$base = new EventBase();
$dns_base = new EventDnsBase($base, TRUE); // Resolución DNS asíncrona
if (!$dns_base) {
exit("Fallo en la inicialización de la base DNS\n");
}
$bev = new EventBufferEvent($base, /* uso de un socket interno */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb", $base
);
if (!$bev) {
exit("Fallo al crear el socket bufferevent\n");
}
//$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);
$output = $bev->output; //$bev->getOutput();
if (!$output->add(
"GET {$argv[2]} HTTP/1.0\r\n".
"Host: {$argv[1]}\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Fallo al añadir la solicitud en el búfer de salida\n");
}
if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
exit("Imposible conectar al host {$argv[1]}\n");
}
$base->dispatch();
?>
El resultado del ejemplo sería algo similar a:
Conectado. HTTP/1.0 301 Moved Permanently Location: http://www.google.co.uk/ Content-Type: text/html; charset=UTF-8 Date: Sat, 09 Mar 2013 12:21:19 GMT Expires: Mon, 08 Apr 2013 12:21:19 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 221 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.co.uk/">here</A>. </BODY></HTML> Cerrando Hecho !