Eio
Introduction
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 queued requests basically is unpredictable. For instance, the following piece of code is incorrect.
Example #1 Incorrect requests
<?php
// Request to create symlink of $filename to $link
eio_symlink($filename, $link);
// Request to move $filename to $new_filename
eio_rename($filename, $new_filename);
// Process requests
eio_event_loop();
?>Example #2 Calling request from a request callback
<?php
function my_symlink_done($filename, $result) {
// Request to move $filename to $new_filename
eio_rename($filename, "/path/to/new-name");
// Process requests
eio_event_loop();
}
// Request to create symlink of $filename to $link
eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_done", $filename);
// Process requests
eio_event_loop();
?>Example #3 Calling request from a request callback
<?php
/* Is called when the group requests are done */
function my_grp_done($data, $result) {
// ...
}
function my_symlink_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_symlink request and add it to the group
// Pass $filename to the callback
$req = eio_symlink($filename, $link,
EIO_PRI_DEFAULT, "my_symlink_done", $filename);
eio_grp_add($grp, $req);
// Process requests
eio_event_loop();
?>Since version 0.3.0 alpha, a variable used in communications with libeio internally, could be retrieved with eio_get_event_stream(). The variable could be used to bind to an event loop supported by some other extension. You might organize a simple event loop where eio and libevent work together:
Example #4 Using eio with libevent
<?php
function my_eio_poll($fd, $events, $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_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");
/* 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 */
?>- Installing/Configuring
- Predefined Constants
- Examples
- Eio Functions
- eio_busy — Artificially increase load. Could be useful in tests, benchmarking
- eio_cancel — Cancels a request
- eio_chmod — Change file/directory permissions
- eio_chown — Change file/directory permissions
- eio_close — Close file
- eio_custom — Execute custom request like any other eio_* call
- eio_dup2 — Duplicate a file descriptor
- eio_event_loop — Polls libeio until all requests proceeded
- eio_fallocate — Allows the caller to directly manipulate the allocated disk space for a file
- eio_fchmod — Change file permissions
- eio_fchown — Change file ownership
- eio_fdatasync — Synchronize a file's in-core state with storage device
- eio_fstat — Get file status
- eio_fstatvfs — Get file system statistics
- eio_fsync — Synchronize a file's in-core state with storage device
- eio_ftruncate — Truncate a file
- eio_futime — Change file last access and modification times
- eio_get_event_stream — Get stream representing a variable used in internal communications with libeio
- eio_get_last_error — Returns string describing the last error associated with a request resource
- eio_grp — Creates a request group
- eio_grp_add — Adds a request to the request group
- eio_grp_cancel — Cancels a request group
- eio_grp_limit — Set group limit
- eio_init — (Re-)initialize Eio
- eio_link — Create a hardlink for file
- eio_lstat — Get file status
- eio_mkdir — Create directory
- eio_mknod — Create a special or ordinary file
- eio_nop — Does nothing, except go through the whole request cycle
- eio_npending — Returns number of finished, but unhandled requests
- eio_nready — Returns number of not-yet handled requests
- eio_nreqs — Returns number of requests to be processed
- eio_nthreads — Returns number of threads currently in use
- eio_open — Opens a file
- eio_poll — Can be to be called whenever there are pending requests that need finishing
- eio_read — Read from a file descriptor at given offset
- eio_readahead — Perform file readahead into page cache
- eio_readdir — Reads through a whole directory
- eio_readlink — Read value of a symbolic link
- eio_realpath — Get the canonicalized absolute pathname
- eio_rename — Change the name or location of a file
- eio_rmdir — Remove a directory
- eio_seek — Seek to a position
- eio_sendfile — Transfer data between file descriptors
- eio_set_max_idle — Set maximum number of idle threads
- eio_set_max_parallel — Set maximum parallel threads
- eio_set_max_poll_reqs — Set maximum number of requests processed in a poll
- eio_set_max_poll_time — Set maximum poll time
- eio_set_min_parallel — Set minimum parallel thread number
- eio_stat — Get file status
- eio_statvfs — Get file system statistics
- eio_symlink — Create a symbolic link
- eio_sync — Commit buffer cache to disk
- eio_sync_file_range — Sync a file segment with disk
- eio_syncfs — Calls Linux' syncfs syscall, if available
- eio_truncate — Truncate a file
- eio_unlink — Delete a name and possibly the file it refers to
- eio_utime — Change file last access and modification times
- eio_write — Write to file