EventListener::__construct

(PECL event >= 1.2.6-beta)

EventListener::__constructCrée un nouvel écouteur de connexion associé avec la base d'événement

Description

public EventListener::__construct ( EventBase $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'.

Valeurs de retour

Retourne un objet EventListener représentant l'écouteur d'événement de connexion.

Historique

Version Description
1.5.0 Le suppot des sockets de domaine UNIX a été ajouté.

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$fdEventBufferEvent::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 <= || $port 65535) {
    exit(
"Port invalide");
}

$l = new MyListener($port);
$l->dispatch();
?>