/** * on_request : Callback function after received HTTP request * @param swoole_http_request $request request object * @param swoole_http_response $response response object * @return None */ public function on_request($request, $response) { // fire event $this->fire_event(__FUNCTION__, func_get_args(), false); // set super global variable if (method_exists($request, 'setGlobal')) { $request->setGlobal(HTTP_GLOBAL_ALL); } else { $this->_set_global_vars($request); } // output access log log_message('info', sprintf('%s %s........%s', $request->server['REQUEST_METHOD'], $request->server['REQUEST_URI'], ip_address())); $blResult = true; // load plugins $app = new super_app($this->load_http_plugins($request, $response)); // save app instance into current process's slot $this->_apps[$this->_server->worker_id] = $app; $http_code = 200; $time_cost = 0; try { // cache the current ouput buffer $app->buffer->cache_output(); // output example // echo '<h1>'.$request->server['REQUEST_METHOD'].' '.$request->server['REQUEST_URI'].' : '.rand(1000, 9999).'</h1><hr />'; // parse url $segment = $app->router->parse_uri($request->server['REQUEST_URI'], $this->config->get('http_default_ctrl', 'base_ctrl'), $this->config->get('http_url_prefix', ''), $this->config->get('http_web_root', '.')); // check security if ($app->has('auth')) { if ($this->config->get('acl_on', true) && false === $app->auth->can()) { throw new Exception('No access : ' . $request->server['REQUEST_URI'], 403); } } $time_start = microtime(true); // route the relevant class if (is_string($segment)) { // output directtly for the specified file $this->_server->sendfile($segment, $request->fd); } else { $cls_name = $app->router->fetch_class(); $action_name = $app->router->fetch_action(); // load class if (!self::load_class($cls_name, 'controllers', true)) { throw new Exception('Failed to load : ' . $cls_name, 404); } // call to current action $http_code = $app->router->route(); } $time_cost = 1000 * (microtime(true) - $time_start); // // change back to previous folder // if( !chdir($old_dir) ){ // throw new Exception('Failed to change back to folder : '.$old_dir, -5); // } } catch (Exception $e) { if ($e->getCode() > 0) { $http_code = $e->getCode(); } else { $http_code = 500; } log_message('error', $e->getMessage()); $blResult = false; } // flash all ouput buffer $content = $app->buffer->flash_output(); // output access log log_message($http_code >= 400 ? 'error' : 'info', sprintf('%s %s........%d (%04f ms) : %d B: %s : %s', $request->server['REQUEST_METHOD'], $request->server['REQUEST_URI'], $http_code, $time_cost, strlen($content), $request->server['REMOTE_ADDR'], $request->header['user-agent'])); // release the plugins $this->release_http_plugins($app->get_raw_data()); unset($this->_apps[$this->_server->worker_id]); // finanlly, send out the response data to client $response->status($http_code); $response->end($content); }