EventListener::__construct
(PECL event >= 1.2.6-beta)
EventListener::__construct — Crée un nouvel écouteur de connexion associé avec la base d'événement
Description
$base
,
callable
$cb
,
mixed
$data
,
int
$flags
,
int
$backlog
,
mixed
$target
)Crée un nouvel écouteur de connexion associé avec la base d'événement.
Liste de paramètres
-
base
-
Base d'événement associée.
-
cb
-
Un callable qui sera invoqué lorsqu'une nouvelle connexion sera reçue.
-
data
-
Données utilisateur personnalisées attachées au paramètre
cb
. -
flags
-
Un masque de constantes EventListener::OPT_*. Voir les constantes EventListener.
-
backlog
-
Contrôle le nombre maximal de connexions en attente que la pile réseau autorise à patienter dans un statut "non encore accepté" ; voir la documentation de la fonction listen de votre système pour plus de détails. Si le paramètre
backlog
est négatif, Libevent tente de récupérer une bonne valeur pour ce paramètre ; s'il vaut zéro, Event présume que la fonction système listen a déjà été appelée sur le socket (target
). -
target
-
Peut être une chaîne de caractères, une ressource de socket, ou un flux associé avec un socket. Dans le cas où ce paramètre est une chaîne de caractères, elle sera analysée comme adresse IP. Elle sera analysée comme sochet de domaine UNIX si elle est préfixée par 'unix:', par exemple, 'unix:/tmp/my.sock'.
Exemples
Exemple #1 Exemple avec EventListener::__construct()
<?php
/*
* Un simple serveur d'écho, basé sur un écouteur de connexion libevent.
*
* Utilisation :
* 1) Dans un terminal Windows, exécutez :
*
* $ php listener.php 9881
*
* 2) Dans un autre terminal Windows, ouvrez la connexion suivante :
*
* $ nc 127.0.0.1 9881
*
* 3) Commencez à taper. Le serveur devrait répéter les entrées.
*/
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 "Impossible d'activer READ\n";
return;
}
}
public function echoReadCallback($bev, $ctx) {
// Copie toutes les données depuis le buffer d'entrée vers le buffer de sortie
// 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 "Erreur depuis 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 "Impossible d'ouvrir la base de l'événement";
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 "Impossible de lier le 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();
}
// Cette fonction de rappel est appelée lorsqu'il y a des données à lire depuis $bev
public function acceptConnCallback($listener, $fd, $address, $ctx) {
// Nous avons une nouvelle connexion ! On lui définit un bufferevent. */
$base = $this->base;
$this->conn[] = new MyListenerConnection($base, $fd);
}
public function accept_error_cb($listener, $ctx) {
$base = $this->base;
fprintf(STDERR, "Erreur reçue %d (%s) sur l'écouteur. "
."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("Port invalide");
}
$l = new MyListener($port);
$l->dispatch();
?>
Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-eventlistener.construct.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.