&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); } ?> ]]>