diff --git a/tasks/RebuildStaticCacheTask.php b/tasks/RebuildStaticCacheTask.php new file mode 100644 index 0000000..c306434 --- /dev/null +++ b/tasks/RebuildStaticCacheTask.php @@ -0,0 +1,126 @@ +hasMethod('allPagesToCache')) { + user_error( + 'RebuildStaticCacheTask::index(): Please define a method "allPagesToCache()" on your Page class to return all pages affected by a cache refresh.', + E_USER_ERROR + ); + } + + + if(!empty($_GET['urls'])) $urls = $_GET['urls']; + else $urls = $page->allPagesToCache(); + + $this->rebuildCache($urls, true); + } + + /** + * Rebuilds the static cache for the pages passed through via $urls + * + * @param array $urls The URLs of pages to re-fetch and cache. + * @param bool $removeAll Remove all stale cache files (default TRUE). + */ + function rebuildCache($urls, $removeAll = true) { + + if(!is_array($urls)) { + // $urls must be an array + user_error("Rebuild cache must be passed an array of urls. Make sure your allPagesToCache function returns an array", E_USER_ERROR); + return; + }; + + if(!Director::is_cli()) echo "
\n"; + echo "Rebuilding cache.\nNOTE: Please ensure that this page ends with 'Done!' - if not, then something may have gone wrong.\n\n"; + + $page = singleton('Page'); + $cacheBaseDir = $page->getDestDir(); + + if(!file_exists($cacheBaseDir)) { + Filesystem::makeFolder($cacheBaseDir); + } + + if (file_exists($cacheBaseDir.'/lock') && !isset($_REQUEST['force'])) die("There already appears to be a publishing queue running. You can skip warning this by adding ?/&force to the URL."); + + touch($cacheBaseDir.'/lock'); + + // Note: Similiar to StaticPublisher->republish() + foreach($urls as $i => $url) { + if($url && !is_string($url)) { + user_error("Bad URL: " . var_export($url, true), E_USER_WARNING); + continue; + } + + // Remove leading slashes from all URLs (apart from the homepage) + if(substr($url,-1) == '/' && $url != '/') $url = substr($url,0,-1); + + $urls[$i] = $url; + } + $urls = array_unique($urls); + sort($urls); + + $mappedUrls = $page->urlsToPaths($urls); + + $start = isset($_GET['start']) ? $_GET['start'] : 0; + $count = isset($_GET['count']) ? $_GET['count'] : sizeof($urls); + if(($start + $count) > sizeof($urls)) $count = sizeof($urls) - $start; + + $urls = array_slice($urls, $start, $count); + + if($removeAll && !isset($_GET['urls']) && $start == 0 && file_exists("../cache")) { + echo "Removing stale cache files... \n"; + flush(); + if (FilesystemPublisher::$domain_based_caching) { + // Glob each dir, then glob each one of those + foreach(glob(BASE_PATH . '/cache/*', GLOB_ONLYDIR) as $cacheDir) { + foreach(glob($cacheDir.'/*') as $cacheFile) { + $searchCacheFile = trim(str_replace($cacheBaseDir, '', $cacheFile), '\/'); + if (!in_array($searchCacheFile, $mappedUrls)) { + echo " * Deleting $cacheFile\n"; + @unlink($cacheFile); + } + } + } + } else { + + } + + echo "done.\n\n"; + } + echo "Rebuilding cache from " . sizeof($mappedUrls) . " urls...\n\n"; + $page->extend('publishPages', $mappedUrls); + + if (file_exists($cacheBaseDir.'/lock')) unlink($cacheBaseDir.'/lock'); + + echo "\n\n== Done! =="; + } + + function show() { + $urls = singleton('Page')->allPagesToCache(); + echo "\n"; + print_r($urls); + echo "\n"; + } +}