&reftitle.examples;
Exemple de minuteurs
stop();
// Stoppe le watcher si les prochains appels provoquent plus de 10 itérations
Ev::iteration() >= 10 and $w->stop();
});
// Crée un minuteur stoppé. Il restera inactif tant que nous ne le démarrons pas nous même
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "Fonction de rappel d'un minuteur créé arrêté\n";
// Stoppe le watcher après 2 itérations
Ev::iteration() >= 2 and $w->stop();
});
// Boucle tant que Ev::stop() n'est pas appelé ou que tous les watchers ne soient stoppés
Ev::run();
// Démarre et regarde si ca fonctionne
$w_stopped->start();
echo "Exécute une seule itération\n";
Ev::run(Ev::RUN_ONCE);
echo "Redémarre le second watcher et tente de gérer le même événement, mais ne bloque pas\n";
$w2->again();
Ev::run(Ev::RUN_NOWAIT);
$w = new EvTimer(10, 0, function() {});
echo "Exécution d'une boucle bloquante\n";
Ev::run();
echo "END\n";
?>
]]>
&example.outputs.similar;
Minuteur périodique. Alerte toutes les 10.5 secondes
]]>
Minuteur périodique. Utilisation de la fonction de rappel de reprogrammation
]]>
Minuteur périodique. Alerte toutes les 10.5 secondes, en commençant maintenant
]]>
Attend que STDIN devienne accessible en lecture
]]>
Utilisation de quelques I/O asynchrones pour accéder à un socket
stop();
// Stoppe le watcher write
$w->stop();
$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: google.co.uk\r\n";
$in .= "Connection: Close\r\n\r\n";
if (!socket_write($socket, $in, strlen($in))) {
trigger_error("Echec lors de l'écriture de $in dans le socket", E_USER_ERROR);
}
$read_watcher = new EvIo($socket, Ev::READ, function ($w, $re)
use ($socket, $e_nonblocking)
{
// Le socket est accessible en lecture. recv() a reçu 20 octets en utilisant le mode non bloquant
$ret = socket_recv($socket, $out, 20, MSG_DONTWAIT);
if ($ret) {
echo $out;
} elseif ($ret === 0) {
// Tout a été lu
$w->stop();
socket_close($socket);
return;
}
// On attrappe EINPROGRESS, EAGAIN, ou EWOULDBLOCK
if (in_array(socket_last_error(), $e_nonblocking)) {
return;
}
$w->stop();
socket_close($socket);
});
Ev::run();
});
$result = socket_connect($socket, $address, $service_port);
Ev::run();
?>
]]>
&example.outputs.similar;
Encapsule une boucle dans une autre
]]>
Encapsule une boucle créée avec le backend kqueue dans la boucle par défaut
]]>
Gestion du signal SIGTERM
stop();
});
Ev::run();
?>
]]>
Surveillance des modifications dans /var/log/messages
attr();
if ($attr['nlink']) {
printf("Taille courante : %ld\n", $attr['size']);
printf("atime actuel : %ld\n", $attr['atime']);
printf("mtime actuel : %ld\n", $attr['mtime']);
} else {
fprintf(STDERR, "Le fichier `messages` n'est plus ici !");
$w->stop();
}
});
Ev::run();
?>
]]>
Surveillance des modifications dans /var/log/messages. On regarde les modifications avec une seconde de délai
stop();
$stat = $w->data;
// 1 seconde après la dernière modification d'un fichier
printf("Taille actuelle : %ld\n", $stat->attr()['size']);
});
$stat = new EvStat("/var/log/messages", 0., function () use ($timer) {
// Réinitialise le watcher timer
$timer->again();
});
$timer->data = $stat;
Ev::run();
?>
]]>
Modification du statut d'un processus
stop();
printf("Le processus %d est sorti avec un statut %d\n", $w->rpid, $w->rstatus);
});
Ev::run();
// Protection contre les Zombies
pcntl_wait($status);
} else {
// On fork le fils
exit(2);
}
?>
]]>