137748cd8SNickeau<?php 237748cd8SNickeau 3c3437056SNickeauuse ComboStrap\CacheExpirationDate; 437748cd8SNickeauuse ComboStrap\CacheManager; 51fa8c418SNickeauuse ComboStrap\CacheMedia; 6*4cadd4f8SNickeauuse ComboStrap\CacheMenuItem; 7*4cadd4f8SNickeauuse ComboStrap\CacheReportHtmlDataBlockArray; 8c3437056SNickeauuse ComboStrap\Cron; 9c3437056SNickeauuse ComboStrap\ExceptionCombo; 10c3437056SNickeauuse ComboStrap\File; 111fa8c418SNickeauuse ComboStrap\Http; 12*4cadd4f8SNickeauuse ComboStrap\Identity; 1337748cd8SNickeauuse ComboStrap\Iso8601Date; 14c3437056SNickeauuse ComboStrap\LogUtility; 15c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore; 16c3437056SNickeauuse ComboStrap\Page; 17c3437056SNickeauuse ComboStrap\PageDescription; 18c3437056SNickeauuse ComboStrap\PageH1; 19c3437056SNickeauuse ComboStrap\PageTitle; 2037748cd8SNickeauuse ComboStrap\PluginUtility; 21*4cadd4f8SNickeauuse ComboStrap\ResourceName; 22*4cadd4f8SNickeauuse ComboStrap\Site; 231fa8c418SNickeauuse dokuwiki\Cache\CacheRenderer; 2437748cd8SNickeau 2537748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 2637748cd8SNickeau 2737748cd8SNickeau/** 2837748cd8SNickeau * Can we use the parser cache 29*4cadd4f8SNickeau * 30*4cadd4f8SNickeau * 31*4cadd4f8SNickeau * 3237748cd8SNickeau */ 3337748cd8SNickeauclass action_plugin_combo_cache extends DokuWiki_Action_Plugin 3437748cd8SNickeau{ 35*4cadd4f8SNickeau 3637748cd8SNickeau 371fa8c418SNickeau 381fa8c418SNickeau const CANONICAL = "cache"; 391fa8c418SNickeau const STATIC_SCRIPT_NAMES = ["/lib/exe/jquery.php", "/lib/exe/js.php", "/lib/exe/css.php"]; 401fa8c418SNickeau 41c3437056SNickeau 42c3437056SNickeau 43c3437056SNickeau 44c3437056SNickeau /** 4537748cd8SNickeau * @param Doku_Event_Handler $controller 4637748cd8SNickeau */ 4737748cd8SNickeau function register(Doku_Event_Handler $controller) 4837748cd8SNickeau { 4937748cd8SNickeau 5037748cd8SNickeau /** 51*4cadd4f8SNickeau * Create a {@link \ComboStrap\CacheResult} 5237748cd8SNickeau */ 53*4cadd4f8SNickeau $controller->register_hook('PARSER_CACHE_USE', 'AFTER', $this, 'createCacheResult', array()); 5437748cd8SNickeau 5537748cd8SNickeau 5637748cd8SNickeau /** 57c3437056SNickeau * To add the cache result in the HTML 581fa8c418SNickeau */ 59c3437056SNickeau $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'addCacheLogHtmlDataBlock', array()); 6037748cd8SNickeau 6137748cd8SNickeau 621fa8c418SNickeau /** 631fa8c418SNickeau * To delete the VARY on css.php, jquery.php, js.php 641fa8c418SNickeau */ 651fa8c418SNickeau $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'deleteVaryFromStaticGeneratedResources', array()); 661fa8c418SNickeau 67*4cadd4f8SNickeau 68c3437056SNickeau /** 69*4cadd4f8SNickeau * Add a icon in the page tools menu 70*4cadd4f8SNickeau * https://www.dokuwiki.org/devel:event:menu_items_assembly 71c3437056SNickeau */ 72*4cadd4f8SNickeau $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'addMenuItem'); 731fa8c418SNickeau 7437748cd8SNickeau } 7537748cd8SNickeau 7637748cd8SNickeau /** 7737748cd8SNickeau * 7837748cd8SNickeau * @param Doku_Event $event 7937748cd8SNickeau * @param $params 8037748cd8SNickeau */ 81*4cadd4f8SNickeau function createCacheResult(Doku_Event $event, $params) 8237748cd8SNickeau { 8337748cd8SNickeau 8437748cd8SNickeau /** 8537748cd8SNickeau * To log the cache used by bar 8637748cd8SNickeau * @var \dokuwiki\Cache\CacheParser $data 8737748cd8SNickeau */ 8837748cd8SNickeau $data = $event->data; 89c3437056SNickeau $slotId = $data->page; 90*4cadd4f8SNickeau $cacheReporter = CacheManager::getOrCreate()->getCacheResultsForSlot($slotId); 91*4cadd4f8SNickeau $cacheReporter->setData($event); 9237748cd8SNickeau 9337748cd8SNickeau 9437748cd8SNickeau } 9537748cd8SNickeau 9637748cd8SNickeau 9737748cd8SNickeau /** 98*4cadd4f8SNickeau * Add cache data to the rendered html page 9937748cd8SNickeau * @param Doku_Event $event 10037748cd8SNickeau * @param $params 10137748cd8SNickeau */ 102c3437056SNickeau function addCacheLogHtmlDataBlock(Doku_Event $event, $params) 10337748cd8SNickeau { 10437748cd8SNickeau 105*4cadd4f8SNickeau if(!PluginUtility::isRenderingRequestedPageProcess()){ 106*4cadd4f8SNickeau return; 107*4cadd4f8SNickeau } 108*4cadd4f8SNickeau $cacheSlotResults = CacheReportHtmlDataBlockArray::getFromRuntime(); 109c3437056SNickeau $cacheJson = \ComboStrap\Json::createFromArray($cacheSlotResults); 11037748cd8SNickeau 111c3437056SNickeau if (PluginUtility::isDevOrTest()) { 112c3437056SNickeau $result = $cacheJson->toPrettyJsonString(); 11337748cd8SNickeau } else { 114c3437056SNickeau $result = $cacheJson->toMinifiedJsonString(); 11537748cd8SNickeau } 11637748cd8SNickeau 117c3437056SNickeau $event->data["script"][] = array( 118*4cadd4f8SNickeau "type" => CacheReportHtmlDataBlockArray::APPLICATION_COMBO_CACHE_JSON, 119c3437056SNickeau "_data" => $result, 120c3437056SNickeau ); 12137748cd8SNickeau 122*4cadd4f8SNickeau 12337748cd8SNickeau } 12437748cd8SNickeau 1251fa8c418SNickeau 1261fa8c418SNickeau 1271fa8c418SNickeau /** 1281fa8c418SNickeau * Delete the Vary header 1291fa8c418SNickeau * @param Doku_Event $event 1301fa8c418SNickeau * @param $params 1311fa8c418SNickeau */ 1321fa8c418SNickeau public static function deleteVaryFromStaticGeneratedResources(Doku_Event $event, $params) 1331fa8c418SNickeau { 1341fa8c418SNickeau 1351fa8c418SNickeau $script = $_SERVER["SCRIPT_NAME"]; 1361fa8c418SNickeau if (in_array($script, self::STATIC_SCRIPT_NAMES)) { 137c3437056SNickeau // To be extra sure, they must have the buster key 138c3437056SNickeau if (isset($_REQUEST[CacheMedia::CACHE_BUSTER_KEY])) { 1391fa8c418SNickeau self::deleteVaryHeader(); 1401fa8c418SNickeau } 1411fa8c418SNickeau } 1421fa8c418SNickeau 1431fa8c418SNickeau } 1441fa8c418SNickeau 1451fa8c418SNickeau /** 1461fa8c418SNickeau * 1471fa8c418SNickeau * No Vary: Cookie 1481fa8c418SNickeau * Introduced at 1491fa8c418SNickeau * https://github.com/splitbrain/dokuwiki/issues/1594 1501fa8c418SNickeau * But cache problem at: 1511fa8c418SNickeau * https://github.com/splitbrain/dokuwiki/issues/2520 1521fa8c418SNickeau * 1531fa8c418SNickeau */ 1541fa8c418SNickeau public static function deleteVaryHeader(): void 1551fa8c418SNickeau { 156c3437056SNickeau if (PluginUtility::getConfValue(action_plugin_combo_staticresource::CONF_STATIC_CACHE_ENABLED, 1)) { 1571fa8c418SNickeau Http::removeHeaderIfPresent("Vary"); 1581fa8c418SNickeau } 1591fa8c418SNickeau } 1601fa8c418SNickeau 161*4cadd4f8SNickeau 162*4cadd4f8SNickeau 163*4cadd4f8SNickeau 164*4cadd4f8SNickeau function addMenuItem(Doku_Event $event, $param) 165c3437056SNickeau { 166c3437056SNickeau 167c3437056SNickeau /** 168*4cadd4f8SNickeau * The `view` property defines the menu that is currently built 169*4cadd4f8SNickeau * https://www.dokuwiki.org/devel:menus 170*4cadd4f8SNickeau * If this is not the page menu, return 171c3437056SNickeau */ 172*4cadd4f8SNickeau if ($event->data['view'] != 'page') return; 173c3437056SNickeau 174*4cadd4f8SNickeau global $INFO; 175*4cadd4f8SNickeau if (!$INFO['exists']) { 176*4cadd4f8SNickeau return; 177c3437056SNickeau } 178c3437056SNickeau /** 179*4cadd4f8SNickeau * Cache is for manager 180c3437056SNickeau */ 181*4cadd4f8SNickeau if (!Identity::isManager()) { 182*4cadd4f8SNickeau return; 183c3437056SNickeau } 184*4cadd4f8SNickeau array_splice($event->data['items'], -1, 0, array(new CacheMenuItem())); 185c3437056SNickeau 186c3437056SNickeau 187c3437056SNickeau } 18837748cd8SNickeau 18937748cd8SNickeau} 190