Cette extension fournit un système POSIX I/O asynchrone via la bibliothèque C » libeio écrit par Marc Lehmann.
Note: Cette extension n'est pas disponible sur les plates-formes Windows.
Il est important de noter que chaque demande est exécuté dans un thread, et l'ordre d'exécution des demandes en attente n'est pas assuré. Pour l'instant, le code suivant n'est pas correct.
Exemple #1 Demandes incorrectes
<?php
// Demande la création d'un lien symbolique $filename vers $link
eio_symlink($filename, $link);
// Demande de déplacement de $filename vers $new_filename
eio_rename($filename, $new_filename);
// Exécution des demandes
eio_event_loop();
?>
Exemple #2 Exécution d'une demande dans la fonction de rappel d'une autre
<?php
function my_symlink_done($filename, $result) {
// Demande de déplacement de $filename vers $new_filename
eio_rename($filename, "/path/to/new-name");
// Exécution des demandes
eio_event_loop();
}
// Demande de création d'un lien symbolique $filename vers $link
eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_done", $filename);
// Exécution des demandes
eio_event_loop();
?>
Exemple #3 Exécution d'une demande depuis la fonction de rappel d'une autre
<?php
/* Sera appelé lorsque le groupe de demandes aura terminé */
function my_grp_done($data, $result) {
// ...
}
function my_symlink_done($filename, $result) {
// Crée une demande eio_rename et l'ajoute au groupe
$req = eio_rename($filename, "/path/to/new-name");
eio_grp_add($grp, $req);
// Vous pouvez vouloir d'autres actions...
}
// Création d'un groupe de demandes
$grp = eio_grp("my_grp_done", "my_grp_data");
// Crée une demande eio_symlink et l'ajoute au groupe
// Passage de $filename à la fonction de rappel
$req = eio_symlink($filename, $link,
EIO_PRI_DEFAULT, "my_symlink_done", $filename);
eio_grp_add($grp, $req);
// Exécution des demandes
eio_event_loop();
?>
Depuis la version 0.3.0 alpha, une variable utilisée dans les communications internes avec libeio peut être récupérée avec la fonction eio_get_event_stream(). La variable peut être utilisé pour lier une boucle d'événements avec d'autres extensions. Vous pouvez organiser une boucle d'événements où libeio et libevent fonctionnent ensemble :
Exemple #4 Utilisation de eio et libevent
<?php
function my_eio_poll($fd, $events, $arg) {
/* Quelques régulations libevent peuvent venir ici .. */
if (eio_nreqs()) {
eio_poll();
}
/* .. et ici */
}
function my_res_cb($d, $r) {
var_dump($r); var_dump($d);
}
$base = event_base_new();
$event = event_new();
// Ce flux est utilisé pour se lier avec libevent
$fd = eio_get_event_stream();
eio_nop(EIO_PRI_DEFAULT, "my_res_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_res_cb", "mkdir data");
/* d'autres appels eio_* ici ... */
// Définit les drapeaux des événements
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));
// Définit l'événement de base
event_base_set($event, $base);
// Active l'événement
event_add($event);
// Démarre la boucle des événements
event_base_loop($base);
/* La même chose est disponible via l'interface libevent bufferisée */
?>