/** * Render the specified page revision. * * @param PageRevision $pageRevision * @param Curry_Request $request * @param array $vars * @param array $options */ protected function render(PageRevision $pageRevision, Curry_Request $request, array $vars, array $options) { Curry_Core::log('Showing page ' . $pageRevision->getPage()->getName() . ' (PageRevisionId: ' . $pageRevision->getPageRevisionId() . ')', Zend_Log::NOTICE); $time = microtime(true); $queries = Curry_Propel::getQueryCount(); $cacheName = __CLASS__ . '_Page_' . md5($request->getUri()); $cacheLifetime = $pageRevision->getPage()->getCacheLifetime(); $doCache = $request->getMethod() === 'GET' && $cacheLifetime !== 0; if ($doCache) { ob_start(); } $generator = self::createPageGenerator($pageRevision, $request); $generator->display($vars, $options); if ($doCache) { $cache = array('page_id' => $pageRevision->getPageId(), 'page_revision_id' => $pageRevision->getPageRevisionId(), 'headers' => headers_list(), 'content' => ob_get_flush()); Curry_Core::$cache->save($cache, $cacheName, array(), $cacheLifetime < 0 ? false : $cacheLifetime); } if (Curry_Core::$config->curry->updateTranslationStrings) { Curry_Language::updateLanguageStrings(); } $time = microtime(true) - $time; $queries = $queries !== null ? Curry_Propel::getQueryCount() - $queries : null; Curry_Core::triggerHook('Curry_Application::render', $pageRevision->getPageId(), $pageRevision->getPageRevisionId(), $time, $queries); }
/** * Insert module and return generated content. * * @param Curry_PageModuleWrapper $pageModuleWrapper * @return string */ protected function insertModule(Curry_PageModuleWrapper $pageModuleWrapper) { Curry_Core::log(($pageModuleWrapper->getEnabled() ? 'Inserting' : 'Skipping') . ' module "' . $pageModuleWrapper->getName() . '" of type "' . $pageModuleWrapper->getClassName() . '" with target "' . $pageModuleWrapper->getTarget() . '"'); if (!$pageModuleWrapper->getEnabled()) { return ""; } $cached = false; $devMode = Curry_Core::$config->curry->developmentMode; if ($devMode) { $time = microtime(true); $sqlQueries = Curry_Propel::getQueryCount(); $userTime = Curry_Util::getCpuTime('u'); $systemTime = Curry_Util::getCpuTime('s'); $memoryUsage = memory_get_usage(true); } $this->moduleCache = array(); $module = $pageModuleWrapper->createObject(); $module->setPageGenerator($this); $cp = $module->getCacheProperties(); $cacheName = $this->getModuleCacheName($pageModuleWrapper, $module); // try to use cached content if ($cp !== null && ($cache = Curry_Core::$cache->load($cacheName)) !== false) { $cached = true; $this->insertCachedModule($cache); $content = $cache['content']; } else { $template = null; if ($pageModuleWrapper->getTemplate()) { $template = Curry_Twig_Template::loadTemplate($pageModuleWrapper->getTemplate()); } else { if ($module->getDefaultTemplate()) { $template = Curry_Twig_Template::loadTemplateString($module->getDefaultTemplate()); } } if ($template && $template->getEnvironment()) { $twig = $template->getEnvironment(); $twig->addGlobal('module', array('Id' => $pageModuleWrapper->getPageModuleId(), 'ClassName' => $pageModuleWrapper->getClassName(), 'Name' => $pageModuleWrapper->getName(), 'ModuleDataId' => $pageModuleWrapper->getModuleDataId(), 'Target' => $pageModuleWrapper->getTarget())); } $content = (string) $module->showFront($template); if ($cp !== null) { $this->moduleCache['content'] = $content; $this->saveModuleCache($cacheName, $cp->getLifetime()); } } if ($devMode) { $time = microtime(true) - $time; $userTime = Curry_Util::getCpuTime('u') - $userTime; $systemTime = Curry_Util::getCpuTime('s') - $systemTime; $memoryUsage = memory_get_usage(true) - $memoryUsage; $sqlQueries = $sqlQueries !== null ? Curry_Propel::getQueryCount() - $sqlQueries : null; $cpuLimit = Curry_Core::$config->curry->debug->moduleCpuLimit; $timeLimit = Curry_Core::$config->curry->debug->moduleTimeLimit; $memoryLimit = Curry_Core::$config->curry->debug->moduleMemoryLimit; $sqlLimit = Curry_Core::$config->curry->debug->moduleSqlLimit; if ($userTime + $systemTime > $cpuLimit || $time > $timeLimit) { trace_warning('Module generation time exceeded limit'); } if ($memoryUsage > $memoryLimit) { trace_warning('Module memory usage exceeded limit'); } if ($sqlQueries > $sqlLimit) { trace_warning('Module sql query count exceeded limit'); } // add module debug info $this->moduleDebugInfo[] = array($pageModuleWrapper->getName(), $pageModuleWrapper->getClassName(), $pageModuleWrapper->getTemplate(), $pageModuleWrapper->getTarget(), $cached, round($time * 1000.0), round(($userTime + $systemTime) * 1000.0), Curry_Util::humanReadableBytes($memoryUsage), Curry_Util::humanReadableBytes(memory_get_peak_usage(true)), $sqlQueries !== null ? $sqlQueries : 'n/a'); } return $content; }
/** * Shutdown function to execute at the end of the request. This function * is called automatically so there is no need to call it explicitly. */ public static function shutdown() { $error = error_get_last(); if ($error !== null && $error['type'] == E_ERROR) { $e = new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']); self::showException($e); } if (self::$logger) { self::$throwExceptionsOnError = false; $queryCount = Curry_Propel::getQueryCount(); $generationTime = self::getExecutionTime(); self::log("Generation time: " . round($generationTime, 3) . "s", Zend_Log::NOTICE); self::log("Peak memory usage: " . Curry_Util::humanReadableBytes(memory_get_peak_usage()), Zend_Log::NOTICE); self::log("SQL query count: " . ($queryCount !== null ? $queryCount : 'n/a'), Zend_Log::NOTICE); if (self::$writer instanceof Zend_Log_Writer_Firebug && !headers_sent()) { // Flush log data to browser $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); $response = $channel->getResponse(); $channel->flush(); //$response->sendHeaders(); // send headers manually so http status (3xx) doesn't get overridden foreach ($response->getRawHeaders() as $header) { header($header); } foreach ($response->getHeaders() as $header) { header($header['name'] . ': ' . $header['value'], $header['replace']); } } } }