(PECL event >= 1.4.0-beta)
EventHttp::setCallback — Définit une fonction de rappel pour une URI spécifique
Définit une fonction de rappel pour une URI spécifique.
path
L'URI pour laquelle la fonction de rappel doit être invoquée.
cb
La fonction de rappel callable
qui sera invoquée lors d'une demande sur l'URI
path. Elle doit correspondre au prototype
suivant :
req
Un objet EventHttpRequest.
arg
Données personnalisées.
arg
Données personnalisées.
Exemple #1 Exemple avec EventHttp::setCallback()
<?php
/*
* Serveur HTTP simple.
*
* Pour le tester :
* 1) Exécutez-le sur le port de votre choix, i.e. :
* $ php examples/http.php 8010
* 2) Dans un autre terminal, connectez-vous sur une adresse de ce port
* et réalisez une requête GET ou POST (les autres sont désactivées ici), i.e.:
* $ nc -t 127.0.0.1 8010
* POST /about HTTP/1.0
* Content-Type: text/plain
* Content-Length: 4
* Connection: close
* (press Enter)
*
* Il devrait afficher :
* a=12
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* 3) Voir ce qu'affiche le serveur sur le précédent terminal.
*/
function _http_dump($req, $data) {
static $counter = 0;
static $max_requests = 2;
if (++$counter >= $max_requests) {
echo "Le compteur a atteint le maximum de requêtes $max_requests. Sortie\n";
exit();
}
echo __METHOD__, " appelée\n";
echo "requête :"; var_dump($req);
echo "données :"; var_dump($data);
echo "\n===== DUMP =====\n";
echo "Commande :", $req->getCommand(), PHP_EOL;
echo "URI :", $req->getUri(), PHP_EOL;
echo "En-têtes d'entrée :"; var_dump($req->getInputHeaders());
echo "En-têtes de sortie :"; var_dump($req->getOutputHeaders());
echo "\n >> Envoi de la réponse ...";
$req->sendReply(200, "OK");
echo "OK\n";
echo "\n >> Lecture du buffer d'entrée ...\n";
$buf = $req->getInputBuffer();
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
echo "Plus de données dans le buffer\n";
}
function _http_about($req) {
echo __METHOD__, PHP_EOL;
echo "URI : ", $req->getUri(), PHP_EOL;
echo "\n >> Envoi de la réponse ...";
$req->sendReply(200, "OK");
echo "OK\n";
}
function _http_default($req, $data) {
echo __METHOD__, PHP_EOL;
echo "URI : ", $req->getUri(), PHP_EOL;
echo "\n >> Envoi de la réponse ...";
$req->sendReply(200, "OK");
echo "OK\n";
}
$port = 8010;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Port invalide");
}
$base = new EventBase();
$http = new EventHttp($base);
$http->setAllowedMethods(EventHttpRequest::CMD_GET | EventHttpRequest::CMD_POST);
$http->setCallback("/dump", "_http_dump", array(4, 8));
$http->setCallback("/about", "_http_about");
$http->setDefaultCallback("_http_default", "valeur de données personnalisée");
$http->bind("0.0.0.0", 8010);
$base->loop();
?>Résultat de l'exemple ci-dessus est similaire à :
a=12 HTTP/1.0 200 OK Content-Type: text/html; charset=ISO-8859-1 Connection: close