International PHP Conference Berlin 2025

Introducción

Esta extensión proporciona E/S POSIX asíncrona a través de la biblioteca de C » libeio escrita por Marc Lehmann.

Nota: Esta extensión no está disponible en plataformas Windows.

Advertencia

Es importante tener en cuenta que cada solicitud se ejecuta en un hilo, y el orden de ejecución continua de peticiones en cola es basicamente impredecible. Por ejemplo, el siguiente trozo de código es incorrecto.

Ejemplo #1 Incorrect requests

<?php
// Petición para crear un enlace simbólico de $nombre_archivo a $enlace
eio_symlink($nombre_archivo, $enlace);

// Petición para mover $nombre_archivo a $nuevo_nombre_archivo
eio_rename($nombre_archivo, $nuevo_nombre_archivo);

// Procesar las peticiones
eio_event_loop();
?>
En el ejemplo de arriba la petición eio_rename() puede finalizar antes que eio_symlink(). Para corregirlo se podría llamar a eio_rename() en la llamada de retorno de eio_symlink():

Ejemplo #2 Llamar a una petición desde una llamada de retorno de petición

<?php
function mi_enlace_simbólico_hecho($nombre_archivo, $resultado) {
// Petición para mover $nombre_archivo a $nuevo_nombre_archivo
eio_rename($nombre_archivo, "/ruta/a/nuevo-nombre");

// Procesar las peticiones
eio_event_loop();
}

// Petición para crear un enlace simbólico de $nombre_archivo a $enlace
eio_symlink($nombre_archivo, $enlace, EIO_PRI_DEFAULT, "mi_enlace_simbólico_hecho", $nombre_archivo);

// Procesar las peticiones
eio_event_loop();
?>
Alternativamente, podría querer crear un grupo de peticiones:

Ejemplo #3 Llamar a una petición desde una llamada de retorno de petición

<?php
/* Se llama cuando el grupo de peticiones está hecho */
function mi_grupo_hecho($data, $resultado) {
// ...
}

function
mi_enlace_simbólico_hecho($nombre_archivo, $resultado) {
// Crear una petición eio_rename y añadirla al grupo
$petición = eio_rename($nombre_archivo, "/ruta/a/nuevo-nombre");
eio_grp_add($grupo, $petición);
// Podría querer añadir más peticiones...
}

// Crear un grupo de peticiones
$grupo = eio_grp("mi_grupo_hecho", "mis_datos_de_grupo");

// Crear una petición eio_symlink y añadirla al grupo
// Pasar $nombre_archivo a la llamada de retorno
$petición = eio_symlink($nombre_archivo, $enlace,
EIO_PRI_DEFAULT, "mi_enlace_simbólico_hecho", $nombre_archivo);
eio_grp_add($grupo, $petición);

// Procesar las peticiones
eio_event_loop();
?>
El grupo es un tipo especial de peticion que podría acumular un conjunto de peticiones eio regulares. Se podría usar para crear una petición compleja para abrir, leer y cerrar un fichero.

Desde la versión 0.3.0 alfa, una variable usada internamete en las comunicaciones con libeio, podía ser recuperada con eio_get_event_stream(). La variable se podría usar para vincularse a un bucle de eventos soportado por alguna otra extensión. Se podría organizar un sencillo bucle de eventos donde eio y libevent trabajaran juntos:

Ejemplo #4 Usar eio con libevent

<?php
function mi_eio_poll($df, $eventos, $argumentos) {
/* Algunas regulaciones de libevent podrían ir aquí .. */
if (eio_nreqs()) {
eio_poll();
}
/* .. y aquí */
}

function
mi_res_cb($d, $r) {
var_dump($r); var_dump($d);
}

$base = event_base_new();
$evento = event_new();

// Este flujo se usa para vincularse con libevent
$df = eio_get_event_stream();

eio_nop(EIO_PRI_DEFAULT, "mi_res_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "mi_res_cb", "mkdir data");
/* algunas llamadas eio_* aquí ... */


// establecer las banderas del evento
event_set($evento, $df, EV_READ /*| EV_PERSIST*/, "mi_eio_poll", array($evento, $base));

// Establecer la base del evento
event_base_set($evento, $base);

// habilitar el evento
event_add($evento);

// iniciar el bucle de eventos
event_base_loop($base);

/* Lo mismo estará disponible mediante interfaz libevent con buffer */
?>

add a note

User Contributed Notes

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