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