Warning EventListener::OPT_CLOSE_ON_FREE is forced when you transmit a "target" string.
The only way to not set EventListener::OPT_CLOSE_ON_FREE is to bind the socket before creating EventListener and use this socekt as "target".EventListener::__construct
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
EventListener::__construct
Референца за `eventlistener.construct.php` со подобрена типографија и навигација.
EventListener::__construct
класата Event
EventListener::__construct — Креира нов слушател за конекција поврзан со основите на настаните
= NULL
EventBase
$base
,callable
$cb
,mixed
$data
,int
$flags
,int
$backlog
,mixed
$target
)
Креира нов слушател за конекција поврзан со основите на настаните.
Параметри
-
base -
Поврзана основа на настани.
-
cb -
А callable што ќе биде повикан кога ќе пристигне нова конекција.
-
data -
Прилагодени кориснички податоци прикачени на
cb. -
flags -
е еднаков на бројот на сигналот.
EventListener::OPT_*константи. Види Константи на EventListener. -
backlog -
Ја контролира максималната дозволена бројка на чекачки конекции што мрежниот стек треба да дозволи да чекаат во состојба што сè уште не е прифатена во секое време; видете ја документацијата за вашиот систем
listenфункција за повеќе детали. Акоbacklogе негативно, Libevent се обидува да избере добра вредност заbacklog; ако е нула, Event претпоставува декаlistenвеќе е повикан на сокетот (target). -
target -
Може да биде стринг, ресурс од сокет или стрим поврзан со сокет. Во случај ако
targetе стринг, стринг ќе биде парсиран како мрежна адреса. Ќе се толкува како патека до UNIX домен сокет, ако е претставен со'unix:', на пр.'unix:/tmp/my.sock'.
Дневник на промени
| Верзија | = NULL |
|---|---|
| PECL настан 1.5.0 | Додадена е поддршка за UNIX домен сокети. |
Примери
Пример #1 EventListener::__construct() example
<?php
/*
* Simple echo server based on libevent's connection listener.
*
* Usage:
* 1) In one terminal window run:
*
* $ php listener.php 9881
*
* 2) In another terminal window open up connection, e.g.:
*
* $ nc 127.0.0.1 9881
*
* 3) start typing. The server should repeat the input.
*/
class MyListenerConnection {
private $bev, $base;
public function __destruct() {
$this->bev->free();
}
public function __construct($base, $fd) {
$this->base = $base;
$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);
$this->bev->setCallbacks(array($this, "echoReadCallback"), NULL,
array($this, "echoEventCallback"), NULL);
if (!$this->bev->enable(Event::READ)) {
echo "Failed to enable READ\n";
return;
}
}
public function echoReadCallback($bev, $ctx) {
// Copy all the data from the input buffer to the output buffer
// Variant #1
$bev->output->addBuffer($bev->input);
/* Variant #2 */
/*
$input = $bev->getInput();
$output = $bev->getOutput();
$output->addBuffer($input);
*/
}
public function echoEventCallback($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
echo "Error from bufferevent\n";
}
if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
//$bev->free();
$this->__destruct();
}
}
}
class MyListener {
public $base,
$listener,
$socket;
private $conn = array();
public function __destruct() {
foreach ($this->conn as &$c) $c = NULL;
}
public function __construct($port) {
$this->base = new EventBase();
if (!$this->base) {
echo "Couldn't open event base";
exit(1);
}
// Variant #1
/*
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($this->socket, '0.0.0.0', $port)) {
echo "Unable to bind socket\n";
exit(1);
}
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1, $this->socket);
*/
// Variant #2
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE, -1,
"0.0.0.0:$port");
if (!$this->listener) {
echo "Couldn't create listener";
exit(1);
}
$this->listener->setErrorCallback(array($this, "accept_error_cb"));
}
public function dispatch() {
$this->base->dispatch();
}
// This callback is invoked when there is data to read on $bev
public function acceptConnCallback($listener, $fd, $address, $ctx) {
// We got a new connection! Set up a bufferevent for it. */
$base = $this->base;
$this->conn[] = new MyListenerConnection($base, $fd);
}
public function accept_error_cb($listener, $ctx) {
$base = $this->base;
fprintf(STDERR, "Got an error %d (%s) on the listener. "
."Shutting down.\n",
EventUtil::getLastSocketErrno(),
EventUtil::getLastSocketError());
$base->exit(NULL);
}
}
$port = 9808;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Invalid port");
}
$l = new MyListener($port);
$l->dispatch();
?>