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();

?>