Невозможно включить кеш в 3.4.4

У меня сложная установка Joomla 3.4.4 с jSeblod и многими другими расширениями. Мы планируем использовать Varnish4 перед веб-сервером и из-за этого необходимо включить соответствующие заголовки Cache-Control.

Но я не могу включить кеширование. Вот что я пробовал:

1)

configuration.php

public $caching = '1';
public $cache_handler = 'file';
public $cachetime = '30';

2) Администратор-> Расширения-> Плагины> Кэширование страницы включено

В плагине используется кэширование браузера

3) С отладчиком отладчик останавливается в любом подключаемом плагине, но не в плагине кэша

4) В разделе «Администратор» & «Расширения»> Управление Я могу найти плагин Cache, установленный

5) В разделе «Administrator-> Extensions-> Discover» он теперь найден.

6) На моем собственном веб-сайте я получаю те же результаты, но заголовок Cache - «Cache-Control: no-cache» вместо «Cache-Control: no-store, no-cache, must-revalidate, post -check = 0, pre-check = 0 "

7) Я создал плагин, который переводит кеш непосредственно перед отправкой ответа:

class plgSystemGtnocachies extends JPlugin
{
    function plgSystemGtnocachies( &$subject, $config )
    {
        parent::__construct( $subject, $config );
    }

    function __destruct()
    {
        if (!headers_sent())
        {
            $this->setCacheHeaders();
        }
    }

    public function onAfterRender()
    {
        JApplicationWeb::allowCache( true );
        $this->setCacheHeaders();
    }

    private function setCacheHeaders()
    {
        JApplicationWeb::setHeader( 'Cache-Control', 'public, max-age=10800', true );
        JApplicationWeb::setHeader( 'Vary', 'Cookie', true );
        JApplicationWeb::setHeader( 'Pragma', '', true );
    }
}

Однако я обнаружил, что когда вызов функции возвращается к

class JEventDispatcher extends JObject
{
    public function trigger($event, $args = array())
    {
        $result = array();

        /*
         * If no arguments were passed, we still need to pass an empty array to
         * the call_user_func_array function.
         */
        $args = (array) $args;

        $event = strtolower($event);

        // Check if any plugins are attached to the event.
        if (!isset($this->_methods[$event]) || empty($this->_methods[$event]))
        {
            // No Plugins Associated To Event!
            return $result;
        }

        // Loop through all plugins having a method matching our event
        foreach ($this->_methods[$event] as $key)
        {
            // Check if the plugin is present.
            if (!isset($this->_observers[$key]))
            {
                continue;
            }

            // Fire the event for an object based observer.
            if (is_object($this->_observers[$key]))
            {
                $args['event'] = $event;
                $value = $this->_observers[$key]->update($args);
------->
            }
            // Fire the event for a function based observer.
            elseif (is_array($this->_observers[$key]))
            {
                $value = call_user_func_array($this->_observers[$key]['handler'], $args);
            }

            if (isset($value))
            {
                $result[] = $value;
            }
        }

        return $result;
    }

JApplicationWeb::getInstance->response->cacheable снова является ложным.

Любая идея, что здесь происходит?

7 голосов | спросил jdog 15 +03002015-10-15T10:46:24+03:00312015bEurope/MoscowThu, 15 Oct 2015 10:46:24 +0300 2015, 10:46:24

2 ответа


2

Я решил эту проблему, используя оболочку выходного буфера вокруг всей установки Joomla.

Некоторая предыстория:

На этом веб-сайте мы используем jSeblod, RSForm, JCHOptimize, Nonumber Joomla CDN и AceSEF. Также есть много плагинов. Из поиска кода я определил, что большинство расширений, похоже, испускают свои собственные заголовки кеша, что делает невозможным контроль над этим с точки зрения Joomla.

Я надеялся, что могу просто стереть все заголовки в OnAfterRender, но, как вы можете видеть в вопросе, это не работает вообще.

Нам нужно было кэшировать все страницы с помощью лака и, в идеале, отключить кеш в Joomla, чтобы простое тестирование было проще. Нам также необходимо было отключить кэширование - Страницы, содержащие RSForm - мы всегда вставляем это в контент - Домашняя страница, поскольку она перенаправляет страну GeoIP - Когда кто-то вошел в систему, как в Администраторе, так и в интерфейсе, поскольку мы используем это для создания контента.

Решение включает настройку файла preend в VHost, системного плагина для идентификации страниц, которые не кэшируются, и содержимого файла предварительной подписки.

Время кэширования жестко запрограммировано в 1800 секунд:

ВХост:

 php_value auto_prepend_file /path/to/my/webfolder/prepend.php

Пользовательский системный плагин:

class plgSystemCacheOn extends JPlugin
{

    function plgSystemCacheOn(&$subject, $config)
    {
            parent::__construct($subject, $config);
    }

    private function getCleanRequestUri()
    {
        list($requestUri, $query) = explode('?', $_SERVER["REQUEST_URI"]);
        return $requestUri;
    }


    private function isHomepage()
    {
        return $this->getCleanRequestUri() === '/' && 
        (!isset($_GET['option']) || !$_GET['option']);
    }


    function onAfterRender()
    {
        $app = JFactory::getApplication();
        $jinput = $app->input;

        if ($app->getName() != 'site') {
            return true;
        }

        $buffer = JResponse::getBody();

        if ($this->isHomepage()){
            header('GTCacheOn: KeepOn');
        }
        if (strstr($buffer, '{rsform')){
            header('GTCacheOn: KeepOn');
        }

        if (JFactory::getUser()->id > 0){
            header('GTUser: Keep');
        }

        return true;
    }
}

prepend.php

function dontCache($headers){

    if ($headers && is_array($headers)){
        foreach($headers as $header){
            list ($headerName, $headerData) = explode( ':', $header);
            if ($headerName === 'GTCacheOn' && trim($headerData) == 'KeepOn') return true;
            if ($headerName === 'GTUser' && trim($headerData) == 'Keep') return true;
        }
    }
    return false;
}    

function only_greentree_headers_allowed( $buffer, $phase )
{
    header_remove( 'Pragma' );
    require (dirname( __FILE__ ). "/libraries/greentree/Helper.php");
    if (in_array($_SERVER['SCRIPT_NAME'], array(
        '/index.php',
        '/media/plg_jchoptimize/assets2/jscss.php'
    ))) {
        header_remove('Expires');
        header_remove('Set-Cookie');
        if (!GreentreeHelper::dontCache(headers_list())) {
            header('Cache-Control: public, max-age=1800', true);
            header('Vary: Cookie', true);
        } else {
            header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0', true);
        }
    }else{
        header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0', true);
    }

    return $buffer;
}

ob_start( 'only_my_headers_allowed' );
ответил jdog 27 +03002015-10-27T22:31:46+03:00312015bEurope/MoscowTue, 27 Oct 2015 22:31:46 +0300 2015, 22:31:46
0

На этом сайте много информации http://massivescale.net/varnish-joomla.html

Говорят, что плагин не может решить эту проблему из-за того, как Joomla! ядро написано. Тем не менее, они предлагают какой-то взлом на своем сайте за 70 фунтов стерлингов. Я бы устал использовать его на сайте с большим количеством дополнений.

SEBLOD основан на компоненте основного контента, поэтому может быть в порядке. Я бы проверял другие плагины по отдельности, и если у вас есть проблемы, отключите их по очереди.

ответил Eoin 27 +03002015-10-27T00:36:25+03:00312015bEurope/MoscowTue, 27 Oct 2015 00:36:25 +0300 2015, 00:36:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132