/** * See if page is in cache and get it if so * Stores the page content in $this->content if something is found. * * @return void * @todo Define visibility */ public function getFromCache() { if (!$this->no_cache) { $cc = $this->tmpl->getCurrentPageData(); if (!is_array($cc)) { $key = $this->id . '::' . $this->MP; // Returns TRUE if the lock is active now $isLocked = $this->acquirePageGenerationLock($this->pagesection_lockObj, $key); if (!$isLocked) { // Lock is no longer active, the data in "cache_pagesection" is now ready $cc = $this->tmpl->getCurrentPageData(); if (is_array($cc)) { // Release the lock $this->releasePageGenerationLock($this->pagesection_lockObj); } } } if (is_array($cc)) { // BE CAREFUL to change the content of the cc-array. This array is serialized and an md5-hash based on this is used for caching the page. // If this hash is not the same in here in this section and after page-generation, then the page will not be properly cached! // This array is an identification of the template. If $this->all is empty it's because the template-data is not cached, which it must be. $cc = $this->tmpl->matching($cc); ksort($cc); $this->all = $cc; } unset($cc); } // clearing the content-variable, which will hold the pagecontent $this->content = ''; // Unsetting the lowlevel config unset($this->config); $this->cacheContentFlag = 0; // Look for page in cache only if caching is not disabled and if a shift-reload is not sent to the server. if (!$this->no_cache && !$this->headerNoCache()) { $lockHash = $this->getLockHash(); if ($this->all) { $this->newHash = $this->getHash(); $GLOBALS['TT']->push('Cache Row', ''); $row = $this->getFromCache_queryRow(); if (!is_array($row)) { $isLocked = $this->acquirePageGenerationLock($this->pages_lockObj, $lockHash); if (!$isLocked) { // Lock is no longer active, the data in "cache_pages" is now ready $row = $this->getFromCache_queryRow(); if (is_array($row)) { // Release the lock $this->releasePageGenerationLock($this->pages_lockObj); } } } if (is_array($row)) { // Release this lock $this->releasePageGenerationLock($this->pages_lockObj); // Call hook when a page is retrieved from cache: if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageLoadedFromCache'])) { $_params = array('pObj' => &$this, 'cache_pages_row' => &$row); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageLoadedFromCache'] as $_funcRef) { \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } // Fetches the lowlevel config stored with the cached data $this->config = (array) unserialize($row['cache_data']); // Getting the content $this->content = $row['content']; // Flag for temp content $this->tempContent = $row['temp_content']; // Setting flag, so we know, that some cached content has been loaded $this->cacheContentFlag = 1; $this->cacheExpires = $row['expires']; if ($this->TYPO3_CONF_VARS['FE']['debug'] || isset($this->config['config']['debug']) && $this->config['config']['debug']) { $dateFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy']; $timeFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm']; $this->content .= LF . '<!-- Cached page generated ' . date($dateFormat . ' ' . $timeFormat, $row['tstamp']) . '. Expires ' . Date($dateFormat . ' ' . $timeFormat, $row['expires']) . ' -->'; } } $GLOBALS['TT']->pull(); } else { $this->acquirePageGenerationLock($this->pages_lockObj, $lockHash); } } }
/** * See if page is in cache and get it if so * Stores the page content in $this->content if something is found. * * @throws \InvalidArgumentException * @throws \RuntimeException */ public function getFromCache() { // clearing the content-variable, which will hold the pagecontent $this->content = ''; // Unsetting the lowlevel config unset($this->config); $this->cacheContentFlag = false; if ($this->no_cache) { return; } $pageSectionCacheContent = $this->tmpl->getCurrentPageData(); if (!is_array($pageSectionCacheContent)) { // Nothing in the cache, we acquire an "exclusive lock" for the key now. // We use the Registry to store this lock centrally, // but we protect the access again with a global exclusive lock to avoid race conditions $this->acquireLock('pagesection', $this->id . '::' . $this->MP); // // from this point on we're the only one working on that page ($key) // // query the cache again to see if the page data are there meanwhile $pageSectionCacheContent = $this->tmpl->getCurrentPageData(); if (is_array($pageSectionCacheContent)) { // we have the content, nice that some other process did the work for us already $this->releaseLock('pagesection'); } else { // We keep the lock set, because we are the ones generating the page now // and filling the cache. // This indicates that we have to release the lock in the Registry later in releaseLocks() } } if (is_array($pageSectionCacheContent)) { // BE CAREFUL to change the content of the cc-array. This array is serialized and an md5-hash based on this is used for caching the page. // If this hash is not the same in here in this section and after page-generation, then the page will not be properly cached! // This array is an identification of the template. If $this->all is empty it's because the template-data is not cached, which it must be. $pageSectionCacheContent = $this->tmpl->matching($pageSectionCacheContent); ksort($pageSectionCacheContent); $this->all = $pageSectionCacheContent; } unset($pageSectionCacheContent); // Look for page in cache only if a shift-reload is not sent to the server. $lockHash = $this->getLockHash(); if (!$this->headerNoCache()) { if ($this->all) { // we got page section information $this->newHash = $this->getHash(); $this->getTimeTracker()->push('Cache Row', ''); $row = $this->getFromCache_queryRow(); if (!is_array($row)) { // nothing in the cache, we acquire an exclusive lock now $this->acquireLock('pages', $lockHash); // // from this point on we're the only one working on that page ($lockHash) // // query the cache again to see if the data are there meanwhile $row = $this->getFromCache_queryRow(); if (is_array($row)) { // we have the content, nice that some other process did the work for us $this->releaseLock('pages'); } else { // We keep the lock set, because we are the ones generating the page now // and filling the cache. // This indicates that we have to release the lock in the Registry later in releaseLocks() } } if (is_array($row)) { // we have data from cache // Call hook when a page is retrieved from cache: if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageLoadedFromCache'])) { $_params = array('pObj' => &$this, 'cache_pages_row' => &$row); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageLoadedFromCache'] as $_funcRef) { GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } // Fetches the lowlevel config stored with the cached data $this->config = $row['cache_data']; // Getting the content $this->content = $row['content']; // Flag for temp content $this->tempContent = $row['temp_content']; // Setting flag, so we know, that some cached content has been loaded $this->cacheContentFlag = true; $this->cacheExpires = $row['expires']; // Restore page title information, this is needed to generate the page title for // partially cached pages. $this->page['title'] = $row['pageTitleInfo']['title']; $this->altPageTitle = $row['pageTitleInfo']['altPageTitle']; $this->indexedDocTitle = $row['pageTitleInfo']['indexedDocTitle']; if (isset($this->config['config']['debug'])) { $debugCacheTime = (bool) $this->config['config']['debug']; } else { $debugCacheTime = !empty($this->TYPO3_CONF_VARS['FE']['debug']); } if ($debugCacheTime) { $dateFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy']; $timeFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm']; $this->content .= LF . '<!-- Cached page generated ' . date($dateFormat . ' ' . $timeFormat, $row['tstamp']) . '. Expires ' . Date($dateFormat . ' ' . $timeFormat, $row['expires']) . ' -->'; } } $this->getTimeTracker()->pull(); return; } } // the user forced rebuilding the page cache or there was no pagesection information // get a lock for the page content so other processes will not interrupt the regeneration $this->acquireLock('pages', $lockHash); }