EventHttpConnection::setCloseCallback

(PECL event >= 1.8.0)

EventHttpConnection::setCloseCallbackDéfinit une fonction de rappel lors de la fermeture de la connexion

Description

public function EventHttpConnection::setCloseCallback( callable $callback , mixed $data = ?): void

Définit une fonction de rappel lors de la fermeture de la connexion.

Liste de paramètres

callback

Fonction de rappel à appeler lors de la fermeture de la connexion. Devrait correspondre au prototype suivant :

function callback( EventHttpConnection $conn = null , mixed $arg = null ): void

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec EventHttpConnection::setCloseCallback()

<?php
/*
 * Configuration de la fonction de rappel de fermeture de connexion
 *
 * Le script gère les connexions fermées en utilisant l'API HTTP.
 *
 * Utilisation :
 * 1) Lancez le serveur :
 * $ php examples/http_closecb.php 4242
 *
 * 2) Lancez un client dans un autre terminal. La session
 * de type Telnet devrait ressembler à ceci :
 *
 * $ nc -t 127.0.0.1 4242
 * GET / HTTP/1.0
 * Connection: close
 *
 * Le serveur devrait afficher quelque chose de similaire à :
 *
 * HTTP/1.0 200 OK
 * Content-Type: multipart/x-mixed-replace;boundary=boundarydonotcross
 * Connection: close
 *
 * <html>
 *
 * 3) Terminez la connexion client brusquement,
 * par exemple en tuant le processus, ou en appuyant sur Ctrl-C.
 *
 * 4) Vérifiez si le serveur a appelé _close_callback.
 * Le script devrait afficher la chaîne "_close_callback" sur la sortie standard.
 *
 * 5) Vérifiez que le processus serveur n'a pas de connexions orphelines,
 * par exemple avec l'utilitaire `lsof`.
 */

function _close_callback($conn)
{
    echo __FUNCTION__, PHP_EOL;
}

function _http_default($req, $dummy)
{
    $conn = $req->getConnection();
    $conn->setCloseCallback('_close_callback', NULL);

    /*
    En activant Event::READ, on protège le serveur contre les connexions non fermées.
    C'est une particularité de Libevent. La bibliothèque désactive les événements
    Event::READ sur cette connexion, et le serveur n'est pas notifié des connexions
    terminées.

    Ainsi, chaque fois qu'un client termine brusquement la connexion, on obtient une
    connexion orpheline. Par exemple, voici une partie de la commande
    `lsof -p $PID | grep TCP` après que le client a terminé la connexion :

    57-php     15057 ruslan  6u  unix 0xffff8802fb59c780   0t0  125187 socket
    58:php     15057 ruslan  7u  IPv4             125189   0t0     TCP *:4242 (LISTEN)
    59:php     15057 ruslan  8u  IPv4             124342   0t0     TCP localhost:4242->localhost:37375 (CLOSE_WAIT)

    où $PID est l'identifiant du processus.

    Le bloc de code suivant corrige ce type de connexions orphelines.
     */
    $bev = $req->getBufferEvent();
    $bev->enable(Event::READ);

    // Nous devons le libérer explicitement. Voir EventHttpRequest::getConnection

    $bev->free(); // Nous devons le libérer explicitement


    $req->addHeader(
        'Content-Type',
        'multipart/x-mixed-replace;boundary=boundarydonotcross',
        EventHttpRequest::OUTPUT_HEADER
    );

    $buf = new EventBuffer();
    $buf->add('<html>');

    $req->sendReply(200, "OK");
    $req->sendReplyChunk($buf);
}

$port = 4242;
if ($argc > 1) {
    $port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
    exit("Port invalide");
}

$base = new EventBase();
$http = new EventHttp($base);

$http->setDefaultCallback("_http_default", NULL);
$http->bind("0.0.0.0", $port);
$base->loop();

?>