Cache kann in 3.4.4 nicht aktiviert werden

7

Ich habe eine komplexe Installation von Joomla 3.4.4 mit jSeblod und vielen anderen Erweiterungen. Wir planen, Varnish4 vor dem Webserver zu verwenden und müssen daher die richtigen Cache-Control-Header aktivieren.

Aber ich kann das Caching nicht aktivieren. Folgendes habe ich versucht:

1)

configuration.php

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

2) Administrator-> Erweiterungen-> Plugins-> Seiten-Caching ist aktiviert

Im Plugin ist das Browser-Caching aktiviert

3) Bei einem Debugger stoppt der Debugger in jedem Plugin, das ich versuche, aber nicht im Cache-Plugin

4) Unter Administrator-> Erweiterungen-> Verwalten finde ich das installierte Cache-Plugin

5) Unter Administrator-> Erweiterungen-> Erkennen wird es jetzt gefunden.

6) Auf meiner eigenen Live-Website erhalte ich die gleichen Ergebnisse, jedoch lautet der Cache-Header "Cache-Control: kein Cache" anstelle von "Cache-Control: kein Store, kein Cache, muss erneut validiert werden, nach dem Check = 0, Vorprüfung = 0 "

7) Ich habe ein Plugin erstellt, das den Cache kurz vor dem Senden der Antwort einschaltet:

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 );
    }
}

Was ich jedoch finde, ist das, wenn der Funktionsaufruf zu zurückkehrt

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 ist wieder falsch.

Irgendeine Idee, was hier los ist?

jdog
quelle

Antworten:

2

Ich habe dieses Problem gelöst, indem ich einen Ausgabepuffer-Wrapper für die gesamte Joomla-Installation verwendet habe.

Einige Hintergrundinformationen:

Auf dieser Website verwenden wir jSeblod, RSForm, JCHOptimize, Nonumber Joomla CDN und AceSEF. Es gibt auch viele Plugins. Bei einer Codesuche stellte ich fest, dass die meisten Erweiterungen ihre eigenen Cache-Header zu emittieren scheinen, was es aus Joomla-Sicht unmöglich macht, dies unter Kontrolle zu bringen.

Ich hatte gehofft, ich könnte einfach alle Header in OnAfterRender löschen, aber wie Sie in der Frage sehen können, funktioniert dies überhaupt nicht.

Wir mussten alle Seiten mit Varnish zwischenspeichern und im Idealfall den Cache in Joomla deaktivieren, damit das direkte Testen einfacher wird. Wir mussten auch das Caching deaktivieren für - Seiten, die RSForm enthalten - wir betteten dies immer in den Inhalt ein - die Homepage, da sie über eine Länderumleitung auf GeoIP-Basis verfügt - wenn jemand angemeldet ist, sowohl im Administrator als auch im Frontend, wie wir dies verwenden Bühneninhalt.

Die Lösung besteht darin, eine Voranstellungsdatei im VHost festzulegen, ein System-Plugin zum Identifizieren von Seiten, die nicht zwischengespeichert werden sollen, und den Inhalt der Voranstellungsdatei.

Unsere Cache-Zeit ist auf 1800 Sekunden fest codiert:

VHost:

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

Benutzerdefiniertes System-Plugin:

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
quelle
0

Es gibt viele Informationen auf dieser Website http://massivescale.net/varnish-joomla.html

Sie sagen, dass ein Plugin dieses Problem aufgrund der Art und Weise, wie Joomla! Kern ist geschrieben. Sie bieten jedoch eine Art Hack auf ihrer Website für £ 70 an. Ich wäre es leid, es auf einer Site mit vielen Add-Ons zu verwenden.

SEBLOD basiert auf der Kerninhaltskomponente und ist daher möglicherweise in Ordnung. Ich würde andere Plugins einzeln überprüfen und wenn Sie Probleme haben, schalten Sie sie einzeln aus.

Eoin
quelle
Hallo, vielen Dank. Ich bin zu dem gleichen Schluss gekommen wie sie und freue mich, meine Lösung zu veröffentlichen, die über eine vorangestellte Datei erfolgt. Ich suche nach einer verbindlichen Antwort, zum Beispiel nach jemandem, der sagt, wie der Joomla-Code geändert werden soll, damit er funktioniert.
JDOG
Diese Seite, die Sie verlinkt haben ... Ihre Lösung ist für 1.5, wobei 1.6 / 1.7 / 2.5 nicht unterstützt wird. Wahrscheinlich nicht wert, dafür zu bezahlen. Es sei denn, es ist nur die Seite, die veraltet ist.
Ville Niemi
@Ville Es funktioniert auch mit Joomla 3.x, wenn Sie genau hinschauen. Nur 1,6, 1,7. 2.6 werden nicht unterstützt, was ich für eine kluge Entscheidung halte. Ich hatte selbst 2 Kunden, die bis vor kurzem 1.5 ausgeführt haben. Diese Websites wurden erstellt, als Joomla 2.5 noch nicht verfügbar war, Virtuemart jedoch nicht verfügbar war. Es stellte sich als unwirtschaftlich heraus, sie zu aktualisieren, wenn Sie die Position einnehmen, dass Virtuemart kein guter Weg mehr ist. Billiger umbauen.
JDOG
@jdog Also war es nur Seite nicht aktuell? Und ja, ich erinnere mich an 1,5 bis 2,5 Migrationen. Auf einer komplexen Site versuchen Sie im Wesentlichen, eine neue Site zu verkaufen.
Ville Niemi
@Ville FAQ Was ist im $ 70-Paket enthalten? Patches für Joomla 1.5, 2.5.4+, 3.0, 3.1, 3.2, 3.3, 3.4 VCL-Dateien für Varnish 2.1+, 3.x und 4.x, ein Plugin, das Artikel aus dem Cache löscht (für Joomla 2.5 oder höher) und 17 Dokumentationsseiten in PDF, ODT und TXT. Wir bieten außerdem 30 Minuten Support, einschließlich Installation. Sie sehen jede Version von Joomla excl. 1.6, 1.7, 2.5.1 /
2/3