<?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(); }
|