3.4.4でキャッシュをオンにできない


7

jSeblodと他の多くの拡張機能を備えたJoomla 3.4.4の複雑なインストールがあります。Webサーバーの前でVarnish4を使用する予定です。そのため、適切なCache-Controlヘッダーをオンにする必要があります。

しかし、私はキャッシュをオンにするようには見えません。これが私が試したものです:

1)

configuration.php

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

2)管理者->拡張機能->プラグイン->ページキャッシュが有効

プラグインでは、ブラウザキャッシュが有効になっています

3)デバッガーを使用すると、私が試したプラグインでデバッガーが停止しますが、キャッシュプラグインでは停止しません

4)[管理者]-> [拡張機能]-> [管理]で、インストールされているキャッシュプラグインを見つけることができます。

5)「アドミニストレーター」->「拡張機能」->「ディスカバー」で、これが見つかりました。

6)自分のライブWebサイトでも同じ結果が得られますが、キャッシュヘッダーは「Cache-Control:no-store、no-cache、must-revalidate、post-check =」ではなく「Cache-Control:no-cache」です。 0、事前チェック= 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 再び偽です。

ここで何が起こっているのでしょうか?

回答:


2

Joomlaのインストール全体に出力バッファーラッパーを使用することで、この問題を解決しました。

背景:

このWebサイトでは、jSeblod、RSForm、JCHOptimize、Nonumber Joomla CDN、およびAceSEFを使用しています。プラグインもたくさんあります。コード検索の結果、ほとんどの拡張機能が独自のキャッシュヘッダーを出力しているように見えるため、Joomlaの観点からこれを制御することは不可能です。

OnAfterRenderのすべてのヘッダーを消去できることを望んでいましたが、質問でわかるように、これはまったく機能しません。

Varnishですべてのページをキャッシュする必要があり、理想的にはJoomlaでキャッシュをオフにして、直接テストを簡単に行えるようにしました。また、RSFormを含むページ-常にコンテンツに埋め込みます-GeoIPベースの国のリダイレクトがあるため、ホームページ-管理者とフロントエンドの両方でログインしているため、これを使用しているため、ステージコンテンツ。

このソリューションでは、VHostにプリペンドファイルを設定する必要があります。これは、キャッシュしないページとプリペンドファイルのコンテンツを識別するシステムプラグインです。

キャッシュ時間は1800秒にハードコーディングされています。

VHost:

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

0

このウェブサイトには多くの情報がありますhttp://massivescale.net/varnish-joomla.html

プラグインはJoomla!の方法が原因でこの問題を解決できないと彼らは言っています。コアが書かれています。しかしながら、彼らは彼らのサイトにある種のハックを£70で提供しています。アドオンの多いサイトでの使用にうんざりするでしょう。

SEBLODはコアコンテンツコンポーネントに基づいているため、問題ないかもしれません。他のプラグインを個別にチェックし、問題が発生した場合は一度に1つずつオフにします。


こんにちは。私は彼らと同じ結論に達し、prependファイルを介して私のソリューションを公開できてうれしいです。私は信頼できる答えを探しています。たとえば、Joomlaコードを機能させるためにJoomlaコードをどのように変更する必要があるかを誰かが言っています。
jdog

あなたがリンクしたそのページ...それらのソリューションは1.5用であり、1.6 / 1.7 / 2.5はサポートされていません。おそらく支払う価値はありません。もちろん、古くなっているのはページだけではありません。
Ville Niemi、2015年

@Villeよく見ると、Joomla 3.xでも動作します。1.6、1.7のみ。2.6はサポートされていません。これは賢い決定だと思います。最近まで1.5を実行していたクライアントが2つありました。これらのサイトは、Joomla 2.5がリリースされたときに作成されましたが、Virtuemartは利用できません。Virtuemartがもう良い方法ではないという立場を取るなら、それらをアップグレードするのは不経済であることがわかりました。安価に再構築します。
jdog

@jdogでは、最新のページではなかっただけですか?そしてええ、1.5から2.5への移行を行ったことを覚えています。複雑なサイトでは、基本的に新しいサイトを販売しようとしています。
Ville Niemi、2015年

@Ville FAQ $ 70パッケージには何が含まれていますか?Joomla 1.5、2.5.4以降、3.0、3.1、3.2、3.3、3.4 VCLファイルのパッチ(Varnish 2.1以降、3.x、4.x用)、キャッシュから記事を削除するプラグイン(Joomla 2.5以降用)、および17 PDF、ODT、TXT形式のドキュメントのページ。また、インストールを含む30分のサポートを追加します。Joomla exclのすべてのバージョンが表示されます。
1.6、1.7、2.5.1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.