<?php 
require 'MIO/Selector.php'; 
require 'MIO/SelectionKey.php'; 
require 'MIO/Stream.php'; 
require 'MIO/StreamFactory.php'; 
require 'MIO/Exception.php'; 
 
/** 
 * Message generator class for spewing out different data 
 * 
 */ 
class MessageGen 
{ 
    private $count=0; 
    public function getMessage() 
    { 
        switch( $this->count ) { 
        case 0: 
            $message = "My first is in tea but not in leaf"; 
            break; 
        case 1: 
            $message = "My second is in teapot and also in teeth"; 
            break; 
        case 2: 
            $message = "My third is in caddy but not in cosy"; 
            break; 
        case 3: 
            $message = "My fourth is in cup but not in rosy"; 
            break; 
        case 4: 
            $message = "My fifth is in herbal and also in health"; 
            break; 
        case 5: 
            $message = "My last is in drink, so what can I be"; 
            break; 
        case 6: 
            $message = "I'm there in a classroom, do you listen to me?"; 
            break; 
        default: 
            return false; 
        } 
        return $message; 
    } 
    public function inc() 
    { 
        $this->count++; 
    } 
} 
 
/** 
 * Echo class for responding to data 
 */ 
class EchoGen 
{ 
    private $message = ''; 
    public function put( $message ) 
    { 
        $this->message = $message; 
    } 
    public function get() 
    { 
        return "The message is: " . $this->message; 
    } 
} 
 
$selector = new MioSelector(); 
$streams  = new MioStreamFactory(); 
 
echo "Creating server..."; 
$selector->register( 
    $streams->createServerStream( '127.0.0.1:8888' ), 
    MioSelectionKey::OP_ACCEPT 
); 
echo "DONE\n"; 
 
$i=0; 
while( true ) { 
    /** 
     * Add socket streams five at a time otherwise the server 
     * buffer gets filled up and fsockopen blocks 
     */ 
    for( $j=0; $j<5 && $i<100; $i++, $j++ ) { 
        echo "Creating client " . ($i+1) . "..."; 
        $selector->register( 
            $streams->createSocketStream( '127.0.0.1', 8888 ), 
            MioSelectionKey::OP_WRITE, 
            new MessageGen() 
        ); 
        echo "DONE\n"; 
    } 
 
    while( !$count = $selector->select() ) { 
        if( $count === false || ($count===0 && count( $selector->selection_keys )==1)) { 
            $selector->close(); 
            break 2; 
        } 
    } 
 
    foreach( $selector->selected_keys as $key ) { 
        if( $key->isAcceptable() ) { 
            while( $stream = $key->stream->accept() ) { 
                $selector->register( 
                    $stream, 
                    MioSelectionKey::OP_READ, 
                    new EchoGen() 
                ); 
            } 
        } elseif( $key->isReadable() ) { 
            $data = $key->stream->read( 4096 ); 
            if( $key->attachment instanceof EchoGen ) { 
                $key->attachment->put( $data ); 
            } elseif( $key->attachment instanceof MessageGen ) { 
                if( !preg_match( '/(The message.*)/', $data, $matches )) { 
                    echo $key->stream . " BAD MATCH\n"; 
                    echo $data . "\n"; 
                } else { 
                    echo $key->stream . ' ' . $matches[1] . "\n"; 
                } 
            } else { 
                throw new Exception( "Invalid attachment type" ); 
            } 
            $key->setInterestOps( MioSelectionKey::OP_WRITE ); 
        } elseif( $key->isWritable() ) { 
            if( $key->attachment instanceof EchoGen ) { 
                $data = $key->attachment->get(); 
            } elseif( $key->attachment instanceof MessageGen ) { 
                if( $data = $key->attachment->getMessage() ) { 
                    $key->attachment->inc(); 
                    echo $key->stream . " Sending: " . $data . "\n"; 
                } else { 
                    echo $key->stream . " Remove Stream (" . count( $selector->selection_keys ) . ")\n"; 
                    $selector->removeKey( $key ); 
                    continue; 
                } 
            } 
            $key->stream->write( $data ); 
            $key->setInterestOps( MioSelectionKey::OP_READ ); 
        } 
    } 
    flush(); 
} 
 
 |