文字

简介

This extension provides asyncronous POSIX I/O by means of » libeio C library written by Marc Lehmann.

Note: 此扩展在 Windows 平台上不可用。

Warning

It is important to 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 ();
?>
In the example above eio_rename() request may finish before eio_symlink() . To fix it you might call eio_rename() in the callback of eio_symlink() :

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 ();
?>
Alternatively, you might want to create a request group:

Example #3 Calling request from a request callback

<?php

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 ();
?>
Group is a special kind of request that could accumulate a set of regular eio requests. This could be used to create a complex request that opens, reads and closes a file.

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 ) {
    

    
if ( eio_nreqs ()) {
        
eio_poll ();
    }
    

}

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" );



// set event flags
event_set ( $event $fd EV_READ  "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 );


?>
上一篇: 下一篇: