xref: /template/strap/action/cache.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
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