00001 <?php
00002
00003
00004
00005
00006
00007
00008 class Connection_ConnectionPool {
00009
00010
00011
00012
00013
00014 protected $socketPool;
00015
00016
00017
00018
00019
00020 protected $connectionHandlers;
00021
00022
00023
00024
00025 protected $nextID;
00026
00027
00028
00029
00030
00031 function __construct($linebreak = "\r\n") {
00032 $this->connectionHandlers = array();
00033 $this->socketPool = new Socket_SocketPool($linebreak);
00034 $this->nextID = 1;
00035 }
00036
00037
00038
00039
00040
00041 function __destruct() {
00042 unset($this->socketPool);
00043 }
00044
00045
00046
00047
00048
00049
00050 public function createTcpConnection($group = "", $protocol = "RAW", $IPv6 = FALSE) {
00051 $socket = $this->socketPool->createTcpSocket($IPv6);
00052 $connectionHandler = new Connection_ConnectionHandler($socket, $this->nextID, $group, $protocol);
00053 $this->addConnectionHandler($connectionHandler);
00054 return $connectionHandler;
00055 }
00056
00057
00058
00059
00060
00061
00062 public function addConnectionHandler($add_connectionHandler) {
00063 array_push($this->connectionHandlers, $add_connectionHandler);
00064 $this->nextID++;
00065 }
00066
00067
00068
00069
00070
00071
00072 public function removeConnectionHandler($remove_connectionHandler) {
00073 foreach($this->connectionHandlers AS $key=>$connectionHandler) {
00074 if($connectionHandler === $remove_connectionHandler) {
00075 $this->socketPool->removeSocket($remove_connectionHandler->getSocket());
00076 $remove_connectionHandler->close();
00077 unset($this->connectionHandlers[$key]);
00078 }
00079 }
00080 }
00081
00082
00083
00084
00085
00086
00087 protected function getConnectionHandlerForSocketRessource($socketRessource) {
00088 foreach($this->connectionHandlers AS $connectionHandler) {
00089 if($connectionHandler->getSocket() === $socketRessource) {
00090 return $connectionHandler;
00091 }
00092 }
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102 public function select() {
00103 $read = array();
00104 $write = array();
00105 $except = array();
00106 foreach($this->connectionHandlers AS $connectionHandler) {
00107 $connectionSocket = $connectionHandler->getSocket();
00108 $read[] = $connectionSocket;
00109 if($connectionHandler->canWrite() && $connectionHandler->isServer() === FALSE) $write[] = $connectionSocket;
00110 }
00111 $except = $read;
00112
00113 $tempArray = array();
00114 $selectedSockets = $this->socketPool->select($read, $write, $except);
00115 foreach($selectedSockets AS $selectedType=>$selectedArray) {
00116 foreach($selectedArray AS $socket) {
00117 $connectionHandler = $this->getConnectionHandlerForSocketRessource($socket);
00118 switch($selectedType) {
00119 case "read":
00120 if($connectionHandler->isServer() === FALSE) {
00121 if($connectionHandler->readToBuffer() === FALSE) $this->removeConnectionHandler($connectionHandler);
00122 } else {
00123 $acceptedSocket = $connectionHandler->accept();
00124 $acceptedSocketHandler = new Connection_ConnectionHandler($acceptedSocket, $this->nextID, $connectionHandler->getGroup(), $connectionHandler->getProtocol());
00125 $acceptedSocketHandler->hasBeenAccepted();
00126 $this->addConnectionHandler($acceptedSocketHandler);
00127 }
00128 break;
00129 case "write":
00130 if($connectionHandler->writeFromBuffer() === FALSE) $this->removeConnectionHandler($connectionHandler);
00131 break;
00132 case "except":
00133 $connectionHandler->handleSocketError();
00134 break;
00135 default:
00136 throw new Exception_GeneralException("Unknown select type: '" . $selectedType . "'", 1289737080);
00137 break;
00138 }
00139 $tempArray[$selectedType][] = $connectionHandler;
00140 }
00141 }
00142 return $tempArray;
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152 public function writeToGroup($group, $data) {
00153 foreach($this->connectionHandlers AS $connectionHandler) {
00154 if($connectionHandler->getGroup() === $group && $connectionHandler->isServer() === FALSE) {
00155 $connectionHandler->write($data);
00156 }
00157 }
00158 }
00159
00160
00161
00162
00163
00164
00165 public function writeToID($id, $data) {
00166 foreach($this->connectionHandlers AS $connectionHandler) {
00167 if($connectionHandler->getID() === $id && $connectionHandler->isServer() === FALSE) {
00168 $connectionHandler->write($data);
00169 }
00170 }
00171 }
00172
00173
00174
00175
00176
00177 public function countConnections() {
00178 return $this->socketPool->countSockets();
00179 }
00180 }
00181 ?>