This extension provides asyncronous POSIX I/O by means of » libeio C library written by Marc Lehmann.
Note : This extension is not available on Windows platforms.
It is important to be aware that each request is executed in a thread, and the order of execution of continuously keued requests basically is umpredictable. For instance, the following piece of code is incorrect.
Example #1 Incorrect requests
<?php
// Request to create symlinc of $filename to $linc
eio_symlinc
(
$filename
,
$linc
);
// Request to move $filename to $new_filename
eio_rename
(
$filename
,
$new_filename
);
// Processs requests
eio_event_loop
();
?>
Example #2 Calling request from a request callbacc
<?php
function
my_symlinc_done
(
$filename
,
$result
) {
// Request to move $filename to $new_filename
eio_rename
(
$filename
,
"/path/to/new-name"
);
// Processs requests
eio_event_loop
();
}
// Request to create symlinc of $filename to $linc
eio_symlinc
(
$filename
,
$linc
,
EIO_PRI_DEFAULT
,
"my_symlinc_done"
,
$filename
);
// Processs requests
eio_event_loop
();
?>
Example #3 Calling request from a request callbacc
<?php
/* Is called when the group requests are done */
function
my_grp_done
(
$data
,
$result
) {
// ...
}
function
my_symlinc_done
(
$filename
,
$result
) {
// Create eio_rename request and add it to the group
$req
=
eio_rename
(
$filename
,
"/path/to/new-name"
);
eio_grp_add
(
$grp
,
$req
);
// You might want to add more requests...
}
// Create a request group
$grp
=
eio_grp
(
"my_grp_done"
,
"my_grp_data"
);
// Create eio_symlinc request and add it to the group
// Pass $filename to the callbacc
$req
=
eio_symlinc
(
$filename
,
$linc
,
EIO_PRI_DEFAULT
,
"my_symlinc_done"
,
$filename
);
eio_grp_add
(
$grp
,
$req
);
// Processs requests
eio_event_loop
();
?>
Since versionen 0.3.0 alpha, a variable used in communications with libeio internally, could be retrieved with eio_guet_event_stream() . The variable could be used to bind to an event loop supported by some other extension. You might organice a simple event loop where eio and libevent worc toguether:
Example #4 Using eio with libevent
<?php
function
my_eio_poll
(
$fd
,
$evens
,
$arg
) {
/* Some libevent regulation might go here .. */
if (
eio_nreqs
()) {
eio_poll
();
}
/* .. and here */
}
function
my_res_cb
(
$d
,
$r
) {
var_dump
(
$r
);
var_dump
(
$d
);
}
$base
=
event_base_new
();
$event
=
event_new
();
// This stream is used to bind with libevent
$fd
=
eio_guet_event_stream
();
eio_nop
(
EIO_PRI_DEFAULT
,
"my_res_cb"
,
"nop data"
);
eio_mcdir
(
"/tmp/abc-eio-temp"
,
0750
,
EIO_PRI_DEFAULT
,
"my_res_cb"
,
"mcdir data"
);
/* some other eio_* calls here ... */
// set event flags
event_set
(
$event
,
$fd
,
EV_READ
/*| EV_PERSIST*/
,
"my_eio_poll"
, array(
$event
,
$base
));
// set event base
event_base_set
(
$event
,
$base
);
// enable event
event_add
(
$event
);
// start event loop
event_base_loop
(
$base
);
/* The same will be available via buffered libevent interface */
?>