1<?php 2 3class Net_Server_Driver_Multiprocess_Processor extends PHP_Fork { 4 var $_server; 5 6 function Net_Server_Driver_Multiprocess_Processor($id, $server) 7 { 8 $this->PHP_Fork("Processor-" . $id); 9 $this->_server = &$server; 10 } 11 12 function run() 13 { 14 // now the callback object has a reference to the server obj into the parent 15 // we need to set a reference to the server obj into the child... 16 $this->_server->callbackObj->setServerReference($this->_server); 17 18 while (true) { 19 $readFDs = array(); 20 array_push($readFDs, $this->_server->initFD); 21 // fetch all clients that are awaiting connections 22 for ($i = 0; $i < count($this->_server->clientFD); $i++) { 23 if (isset($this->_server->clientFD[$i])) 24 array_push($readFDs, $this->_server->clientFD[$i]); 25 } 26 // block and wait for data or new connection 27 $ready = @socket_select($readFDs, $this->_server->null, $this->_server->null, null); 28 29 if ($ready === false) { 30 die("socket_select failed."); 31 } 32 // check for new connection 33 if (in_array($this->_server->initFD, $readFDs)) { 34 $newClient = $this->acceptConnection($this->_server->initFD); 35 $this->setVariable("threadWorking", true); 36 // check for maximum amount of connections 37 /* 38 if ($this->maxClients > 0) { 39 if ($this->clients > $this->maxClients) { 40 $this->_sendDebugMessage("Too many connections."); 41 42 if (method_exists($this->callbackObj, "onConnectionRefused")) { 43 $this->callbackObj->onConnectionRefused($newClient); 44 } 45 46 $this->closeConnection($newClient); 47 } 48 } */ 49 50 if (--$ready <= 0) { 51 continue; 52 } 53 } 54 // check all clients for incoming data 55 for($i = 0; $i < count($this->_server->clientFD); $i++) { 56 if (!isset($this->_server->clientFD[$i])) { 57 continue; 58 } 59 60 if (in_array($this->_server->clientFD[$i], $readFDs)) { 61 $data = $this->_server->readFromSocket($i); 62 // empty data => connection was closed 63 if (!$data) { 64 $this->_server->_sendDebugMessage("*** Connection closed by peer"); 65 $this->_server->closeConnection($i); 66 } else { 67 $this->_server->_sendDebugMessage("Received " . trim($data) . " from " . $i); 68 69 if (method_exists($this->_server->callbackObj, "onReceiveData")) { 70 $this->_server->callbackObj->onReceiveData($i, $data); 71 } 72 } 73 $this->setVariable("threadWorking", false); 74 } 75 } 76 } 77 } 78 79 function acceptConnection(&$socket) 80 { 81 for($i = 0 ; $i <= count($this->_server->clientFD); $i++) { 82 if (!isset($this->_server->clientFD[$i]) || $this->_server->clientFD[$i] == null) { 83 $this->_server->clientFD[$i] = socket_accept($socket); 84 socket_setopt($this->_server->clientFD[$i], SOL_SOCKET, SO_REUSEADDR, 1); 85 $peer_host = ""; 86 $peer_port = ""; 87 socket_getpeername($this->_server->clientFD[$i], $peer_host, $peer_port); 88 $this->_server->clientInfo[$i] = array("host" => $peer_host, 89 "port" => $peer_port, 90 "connectOn" => time() 91 ); 92 // $this->clients++; 93 $this->_server->_sendDebugMessage("New connection (" . $i . ") from " . $peer_host . " on port " . $peer_port); 94 95 if (method_exists($this->_server->callbackObj, "onConnect")) { 96 $this->_server->callbackObj->onConnect($i); 97 } 98 return $i; 99 } 100 } 101 } 102} 103