PHP Conference Nagoya 2025

Introduction

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.

Avertissement

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();
?>
Dans l'exemple ci-dessus, la fonction eio_rename() peut se terminer avant la fonction eio_symlink(). Pour résoudre ce problème, vous pouvez appeler la fonction eio_rename() dans la fonction de rappel de la fonction eio_symlink():

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();
?>
Alternativement, vous pouvez créer un groupe de demandes :

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();
?>
Un groupe est une demande spéciale qui peut cumuler un jeu de demandes eio. Ce mécanisme peut être utile pour créer une demande complexe qui ouvre, lit et ferme un fichier.

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 */
?>

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top