123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- namespace Grav\Plugin;
- use Grav\Common\Config\Config;
- use Grav\Common\Page\Interfaces\PageInterface;
- use Grav\Common\Plugin;
- use Grav\Common\Uri;
- use Grav\Framework\Psr7\Response;
- use RocketTheme\Toolbox\Event\Event;
- /**
- * Class AdvancedPageCachePlugin
- * @package Grav\Plugin
- */
- class AdvancedPageCachePlugin extends Plugin
- {
- /** @var Config $config */
- protected $config;
- /** @var string */
- protected $pagecache_key;
- /**
- * @return array
- */
- public static function getSubscribedEvents()
- {
- return [
- 'onPluginsInitialized' => ['onPluginsInitialized', 1000]
- ];
- }
- /**
- * Return `true` if the page has no extension, or has the default page extension.
- * Return `false` if for example is a RSS version of the page
- */
- private function isValidExtension() : bool
- {
- /** @var Uri $uri */
- $uri = $this->grav['uri'];
- $extension = $uri->extension();
- if (!$extension) {
- return true;
- }
- $disabled_extensions = (array)$this->grav['config']->get('plugins.advanced-pagecache.disabled_extensions');
- return !in_array($extension, $disabled_extensions, true);
- }
- /**
- * Initialize configuration
- */
- public function onPluginsInitialized(): void
- {
- /** @var Uri $uri */
- $uri = $this->grav['uri'];
- $config = (array)$this->grav['config']->get('plugins.advanced-pagecache');
- $full_route = $uri->uri();
- $route = str_replace($uri->baseIncludingLanguage(), '', $full_route);
- $params = $uri->params(null, true);
- $query = $uri->query(null, true);
- $user = $this->grav['user'] ?? null;
- $lang = $this->grav['language']->getLanguageURLPrefix();
- // Definitely don't run in admin plugin or is not a valid extension
- if ($this->isAdmin() || !$this->isValidExtension()) {
- return;
- }
- // If this url is not whitelisted try some other tests
- if (!in_array($route, (array)$config['whitelist'], true)) {
- // do not run in these scenarios
- if (
- ($config['disabled_with_params'] && !empty($params)) ||
- ($config['disabled_with_query'] && !empty($query)) ||
- ($config['disabled_on_login'] && ($user && $user["authenticated"])) ||
- in_array($route, (array)$config['blacklist'], true)
- ) {
- return;
- }
- }
- // Should run and store page
- if ($config['per_user_caching']) {
- $this->pagecache_key = md5('adv-pc-' . $lang . $full_route . $user["username"]);
- } else {
- $this->pagecache_key = md5('adv-pc-' . $lang . $full_route);
- }
- // TODO: remove when minimum required Grav >= 1.7.15
- if (version_compare($this->grav->getVersion(), '1.7.15', '<')) {
- $this->enable([
- 'onOutputGenerated' => ['onOutputGenerated', -1000]
- ]);
- } else {
- $this->enable([
- 'onOutputRendered' => ['onOutputRendered', 1000]
- ]);
- }
- $pageCache = $this->grav['cache']->fetch($this->pagecache_key);
- if (is_array($pageCache)) {
- $response = new Response($pageCache['code'], $pageCache['headers'], $pageCache['html']);
- $this->grav->close($response);
- }
- }
- /**
- * Save the page to the cache
- * TODO: remove when minimum required Grav >= 1.7.15
- */
- public function onOutputGenerated(Event $event): void
- {
- /** @var PageInterface $page */
- $page = $this->grav['page'];
- $html = $this->grav->output;
- $item = [
- 'code' => $page->httpResponseCode(),
- 'headers' => $page->httpHeaders(),
- 'html' => $html,
- ];
- $this->grav['cache']->save($this->pagecache_key, $item);
- }
- /**
- * Save the page to the cache
- */
- public function onOutputRendered(Event $event): void
- {
- /** @var PageInterface $page */
- $page = $event['page'];
- $html = $event['output'];
- $item = [
- 'code' => $page->httpResponseCode(),
- 'headers' => $page->httpHeaders(),
- 'html' => $html,
- ];
- $this->grav['cache']->save($this->pagecache_key, $item);
- }
- }
|