public static function getServerResponse($url = null, $format = false, $onlyResponseCode = false, $checkIfSent = false) { if (!is_bool($checkIfSent)) { throw new \Exception('CheckIfSent parameter must be an boolean'); } if (!is_bool($onlyResponseCode)) { throw new \Exception('onlyResponseCode parameter must be an boolean'); } if ($onlyResponseCode) { return self::getHeaderResponseStatusCode(); } if (is_null($url)) { $request = Http::getRootRequest(); $url = Http::isHttps() ? 'https://' . $request : 'http://' . $request; } if (!Validate::isUrl($url)) { throw new \Exception('Url must be a valid url'); } if (!is_bool($format)) { throw new \Exception('Format parameter must be an boolean'); } $response = $checkIfSent ? headers_sent() ? get_headers($url, $format) : null : get_headers($url, $format); if (!$response && !$checkIfSent) { throw new \Exception('Error while get headers response status'); } return $response; }
public function initTemplate($forceReplace = false) { if ($this->_templateInitialized && !$forceReplace) { return; } $tpl = Template::getTemplate(); //no template if (!$tpl) { $this->log->debug('try initialize template, but no template configured', 'router'); return false; } $this->_template = $tpl; // Set langs/urls vars into tpl $this->_template->setVar('urls', Router::getUrls($this->language->getLanguage(), Http::isHttps()), false, true); $this->_template->setVar('langs', $this->language->getVars(true), false, true); $this->_template->setVar('lang', $this->language->getLanguage(), false, true); //init assets if (!Http::isAjax()) { $this->_template->initAssets(); } $this->_templateInitialized = true; $this->log->debug('Initialize template', 'router'); }
public function stop() { if ($this->_isInit && $this->_isRun) { // run caches gc $caches = Cache::getCaches(); foreach ($caches as $cache) { $cache->runGc(); } //profiling if (self::getProfiler()) { // Caches foreach ($caches as $cache) { Logger::getInstance()->debug('Adaptater : "' . get_class($cache) . '"', 'cache' . $cache->getName()); } // Databases $databases = Database::getDatabases(); foreach ($databases as $database) { Logger::getInstance()->debug('Type : ' . $database->getType(), 'database' . $database->getName()); Logger::getInstance()->debug('Adaptater : ' . get_class($database->getAdaptater()), 'database' . $database->getName()); $stats = $database->getStats(); Logger::getInstance()->debug('Queries : ' . (string) $database->getQueryCount() . ' (Aproximately memory used : ' . $stats['ram'] . ' KB in aproximately ' . $stats['time'] . ' ms)', 'database' . $database->getName()); Logger::getInstance()->debug('Servers : ' . $database->countServers() . ' (Masters : ' . $database->countServers(Server::TYPE_MASTER) . ' Slaves : ' . $database->countServers(Server::TYPE_SLAVE) . ')', 'database' . $database->getName()); } // Templates $templates = Template::getTemplates(); foreach ($templates as $template) { Logger::getInstance()->debug('Adaptater : ' . get_class($template), 'template' . $template->getName()); } // Language Logger::getInstance()->debug('Language default is : "' . Language::getInstance()->getDefaultLanguage() . '"', 'language'); Logger::getInstance()->debug(Language::getInstance()->countVars() . ' vars defined', 'language'); // Router Logger::getInstance()->debug('Current url : ' . Http::getCurrentUrl(), 'router'); Logger::getInstance()->debug('Current route : ' . Router::getInstance()->getCurrentRoute(), 'router'); Logger::getInstance()->debug('Current route rule : ' . Router::getInstance()->getCurrentRule(), 'router'); Logger::getInstance()->debug('Ajax request : ' . (int) Http::isAjax(), 'router'); Logger::getInstance()->debug('Ssl request : ' . (int) Http::isHttps(), 'router'); Logger::getInstance()->debug('Request dispatched in aproximately : ' . Benchmark::getInstance('router')->stopTime()->getStatsTime() . ' ms', 'router'); Logger::getInstance()->debug('Aproximately memory used : ' . Benchmark::getInstance('router')->stopRam()->getStatsRam() . ' KB', 'router'); // Logger debug informations and benchmark Logger::getInstance()->addGroup('logger', 'Logger Benchmark and Informations', true); Logger::getInstance()->debug(Logger::getInstance()->countObservers() . ' observers registered', 'logger'); Logger::getInstance()->debug(Logger::getInstance()->countGroups() . ' groups and ' . (Logger::getInstance()->countLogs() + 3) . ' logs', 'logger'); Logger::getInstance()->debug('In aproximately ' . Benchmark::getInstance('logger')->stopTime()->getStatsTime() . ' ms', 'logger'); Logger::getInstance()->debug('Aproximately memory used : ' . Benchmark::getInstance('logger')->stopRam()->getStatsRam() . ' KB', 'logger'); // Autoloader Logger::getInstance()->addGroup('autoloader', 'Autoloader report', true); $logs = Autoloader::getLogs(); foreach ($logs as &$log) { Logger::getInstance()->debug($log, 'autoloader'); } Logger::getInstance()->debug(count(Autoloader::getAutoloaders()) . ' autoloader adaptaters, ' . count(Autoloader::getDirectories()) . ' directories and ' . count(Autoloader::getNamespaces()) . ' namespaces registered', 'autoloader'); Logger::getInstance()->debug('Loading ' . count(Autoloader::getClasses()) . ' classes (' . Autoloader::countGlobalizedClasses() . ' globalized classes) in aproximately ' . round(Autoloader::getBenchmark('time') * 1000, 4) . ' ms', 'autoloader'); Logger::getInstance()->debug('Aproximately memory used : ' . round(Autoloader::getBenchmark('memory') / 1024, 4) . ' KB', 'autoloader'); Autoloader::purgeLogs(); Autoloader::purgeBenchmark(); // Global informations && Benchmark Logger::getInstance()->addGroup('global', 'Global Benchmark and Informations', true); Logger::getInstance()->debug('Page generated in aproximately : ' . Benchmark::getInstance('global')->stopTime()->getStatsTime() . ' ms', 'global'); Logger::getInstance()->debug('Aproximately memory used : ' . Benchmark::getInstance('global')->stopRam()->getStatsRam() . ' KB - Memory allocated : ' . memory_get_peak_usage(true) / 1024 . ' KB', 'global'); } //notify logger Logger::getInstance()->notify(); // Stop managers ExceptionManager::getInstance()->stop(); ErrorManager::getInstance()->stop(); // avoid multi call $this->_isInit = false; $this->_isRun = false; } }
public function getUrlAsset($type, $ssl = false) { if (!is_string($type)) { throw new \Exception('Asset type must be a string'); } if (Http::isHttps()) { $ssl = true; } if (!is_array($this->_assets)) { return false; } if (!array_key_exists($type, $this->_assets)) { return false; } $asset = $this->_assets[$type]; return Router::getHost(true, $ssl) . str_replace(DS, '/', str_replace(PATH_ROOT, '', $asset['directory'])); }
public function initAssets() { Logger::getInstance()->debug('Initialize assets', 'template' . $this->_name); foreach ($this->_assets as $assetType => $assetDatas) { if (!isset($assetDatas['directory'])) { throw new \Exception('Miss asset : "' . $assetType . '" directory for template : "' . $this->_name . '"'); } //check directory if (!is_dir($assetDatas['directory'])) { throw new \Exception('Invalid asset : "' . $assetType . '" directory for template : "' . $this->_name . '"'); } //cache if ($assetType == self::ASSET_CSS || $assetType == self::ASSET_JS) { if (isset($assetDatas['cache'])) { $compress = isset($assetDatas['cache']['compress']) ? $assetDatas['cache']['compress'] : false; $rewriteUrls = isset($assetDatas['cache']['rewriteUrls']) ? $assetDatas['cache']['rewriteUrls'] : false; $minify = new Minify($assetDatas['cache']['name'], $assetDatas['directory'], $assetType, $compress, $rewriteUrls, $this->_name); if ($assetType == self::ASSET_CSS) { $this->_css = $minify->minify(); } if ($assetType == self::ASSET_JS) { $this->_js = $minify->minify(); } } } //loadUrls and Langs into js if ($assetType == self::ASSET_JS) { if (isset($assetDatas['loadUrls'])) { $this->_js .= 'var urls = {};'; foreach ($this->_vars->urls as $urlName => $urlValue) { $this->_js .= 'urls["' . $urlName . '"] = "' . $urlValue . '";'; } //add img, css, js .. urls if ($img = $this->getUrlAsset(self::ASSET_IMG, Http::isHttps())) { $this->_js .= 'urls["' . self::ASSET_IMG . '"] = "' . $img . '";'; } if ($css = $this->getUrlAsset(self::ASSET_CSS, Http::isHttps())) { $this->_js .= 'urls["' . self::ASSET_CSS . '"] = "' . $css . '";'; } if ($js = $this->getUrlAsset(self::ASSET_JS, Http::isHttps())) { $this->_js .= 'urls["' . self::ASSET_JS . '"] = "' . $js . '";'; } if ($font = $this->getUrlAsset(self::ASSET_FONT, Http::isHttps())) { $this->_js .= 'urls["' . self::ASSET_FONT . '"] = "' . $font . '";'; } if ($sound = $this->getUrlAsset(self::ASSET_SOUND, Http::isHttps())) { $this->_js .= 'urls["' . self::ASSET_SOUND . '"] = "' . $sound . '";'; } } if (isset($assetDatas['loadLangs'])) { $this->_js .= 'var langs = {};'; foreach ($this->_vars->langs as $langName => $langValue) { $this->_js .= 'langs["' . $langName . '"] = "' . $langValue . '";'; } } } //add asset $this->_assets[$assetType] = $assetDatas; } }
protected function _getContent() { if ($this->_type == Template::ASSET_CSS) { $content = ''; foreach ($this->_files as $file) { $f = file_get_contents($file['name']); if ($this->_compress && !$file['alreadyCompressed']) { $f = $this->_compressCss($f); } $content .= $f; } //rewrite url path if ($this->getRewriteUrls()) { return preg_replace("#\\[HOSTNAME]#", Router::getHost(true, Http::isHttps()), $content); } return $content; } elseif ($this->_type == Template::ASSET_JS) { $notCompressed = $content = ''; foreach ($this->_files as $file) { $js = file_get_contents($file['name']); if ($this->_compress && !$file['alreadyCompressed']) { // Compress file with Javascript Packer plugin $packer = new JavaScriptPacker($js); $notCompressed .= trim($packer->pack()); } else { $content .= $js; } if (substr($notCompressed, -1) != ';') { $notCompressed .= ';'; } } //rewrite url path if ($this->getRewriteUrls()) { return preg_replace("#\\[HOSTNAME]#", Router::getHost(true, Http::isHttps()), $content . $notCompressed); } return $content . $notCompressed; } }
protected function _runController($controller, $methods = array(), $vars = array(), $requireSsl = false, $requireAjax = false, $autoSetAjax = true, $requireHttpMethod = null, $httpResponseStatusCode = null, $httpProtocol = null) { $controllerExplode = explode($this->getNamespaceSeparator(), (string) $controller); if (is_array($controllerExplode) && count($controllerExplode) > 1) { $controllerName = $this->getNamespaceSeparator() . ucfirst(array_pop($controllerExplode)); $controller = implode($this->getNamespaceSeparator(), $controllerExplode) . $controllerName; } else { $controller = (string) ucfirst($controller); } Logger::getInstance()->debug('Run controller : "' . $controller . '"', 'router'); $controllerClass = $this->getControllersNamespace(true) . $controller; // Check if controller exists (with controllers namespace) if (!class_exists($controllerClass)) { throw new \Exception('Controller "' . $controllerClass . '" not found'); } $controller = $controllerClass; if (!is_array($vars)) { throw new \Exception('Controller : "' . $controller . '" vars must be an array'); } if (!is_array($methods)) { throw new \Exception('Controller : "' . $controller . '" methodes must be an array'); } $inst = new \ReflectionClass($controller); if ($inst->isInterface() || $inst->isAbstract()) { throw new \Exception('Controller "' . $controller . '" cannot be an interface of an abstract class'); } $ctrl = $inst->newInstance(); if ($ctrl->getAutoCallDisplay()) { if (!$inst->hasMethod('display')) { throw new \Exception('Controller "' . $controller . '" must be implement method "Diplay'); } if (!$inst->hasMethod('initTemplate')) { throw new \Exception('Controller "' . $controller . '" must be implement method "initTemplate'); } } if (!Cli::isCli()) { if (!Http::isHttps() && $requireSsl) { Logger::getInstance()->debug('Controller "' . $controller . '" need ssl http request', 'router'); $this->show400(true); } if (!is_null($requireHttpMethod)) { if ($requireHttpMethod != Http::getMethod()) { Logger::getInstance()->debug('Controller "' . $controller . '" invalid http method'); $this->show405(true); } } if (!Http::isAjax() && $requireAjax) { Logger::getInstance()->debug('Controller "' . $controller . '" need ajax http request'); $this->show400(true); } if (Http::isAjax() && $autoSetAjax) { $ctrl->setAjaxController(); } if (!is_null($httpResponseStatusCode) || !is_null($httpProtocol)) { Header::setResponseStatusCode(is_null($httpResponseStatusCode) ? 200 : $httpResponseStatusCode, true, true, $httpProtocol); } } if ($methods) { foreach ($methods as $methodName => $methodParams) { Logger::getInstance()->debug('Call method : "' . $methodName . '"', 'router'); if (!method_exists($ctrl, $methodName) || !$inst->getMethod($methodName)->isPublic()) { throw new \Exception('Method "' . $methodName . '" don\'t exists or isn\'t public on controller "' . $controller . '"'); } $args = array(); if (!is_array($methodParams)) { $args[] = $methodParams; } else { foreach ($methodParams as $parameter) { //check if is [['key']] type, or direct value if (stripos($parameter, '[[') === false) { $args[] = $parameter; } else { if (count($vars) > 0) { $key = (int) str_replace(array('[', ']'), '', $parameter); if (array_key_exists($key, $vars)) { $args[] = $vars[$key]; } } else { $args[] = $parameter; } } } } foreach ($args as $arg) { Logger::getInstance()->debug('Add argument : "' . $arg . '"', 'router'); } // Call method with $args \call_user_func_array(array($ctrl, $methodName), $args); } } $this->_controller = $ctrl; //call display only when have a template if ($ctrl->getAutoCallDisplay() && Template::getTemplate()) { Logger::getInstance()->debug('Call method "display"', 'router'); $ctrl->display(); } }