public static function process() { // if socketClient is in write set, and $socket->connecting === true, set connecting to false and call on_connect $read_set = SocketEngine::create_read_set(); $write_set = SocketEngine::create_write_set(); $exception_set = SocketEngine::create_exception_set(); $event_time = time(); while (($events = socket_select($read_set, $write_set, $exception_set, null)) !== false) { AirD::Log(AirD::LOGTYPE_INTERNAL, "Top of main loop.", true); if ($events > 0) { AirD::Log(AirD::LOGTYPE_INTERNAL, "Processing " . $events . " socket events", true); foreach ($read_set as $socket) { AirD::Log(AirD::LOGTYPE_INTERNAL, "Processing a read event for " . (int) $socket, true); SocketEngine::$clients[(int) $socket]->read(); } foreach ($write_set as $socket) { $socket = SocketEngine::get_class($socket); if (is_subclass_of($socket, 'socketClient')) { if ($socket->connecting === true) { $socket->on_connect(); $socket->connecting = false; } $socket->do_write(true); } } foreach ($exception_set as $socket) { $socket = SocketEngine::get_class($socket); if (is_subclass_of($socket, 'socketClient')) { $socket->on_disconnect(); if (isset(SocketEngine::$clients[(int) $socket->socket])) { unset(SocketEngine::$clients[(int) $socket->socket]); } } } } if (time() - $event_time > 1) { // only do this if more then a second passed, else we'd keep looping this for every bit recieved foreach (SocketEngine::$clients as $socket) { $socket->on_timer(); } $event_time = time(); } SocketEngine::clean_sockets(); $read_set = SocketEngine::create_read_set(); $write_set = SocketEngine::create_write_set(); $exception_set = SocketEngine::create_exception_set(); } }