Không thể bật bộ đệm trong 3.4.4


7

Tôi có một bản cài đặt phức tạp của Joomla 3.4.4 với jSeblod và nhiều phần mở rộng khác. Chúng tôi đang lên kế hoạch sử dụng Varnish4 trước máy chủ web và vì điều đó cần phải bật các tiêu đề Cache-Control thích hợp.

Nhưng tôi dường như không thể bật bộ nhớ đệm. Đây là những gì tôi đã thử:

1)

configuration.php

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

2) Quản trị viên-> Tiện ích mở rộng-> Plugin-> Bộ đệm trang được bật

Trong plugin, Trình duyệt bộ đệm được bật

3) Với trình gỡ lỗi, trình gỡ lỗi dừng trong bất kỳ plugin nào tôi thử, nhưng không phải trong plugin bộ đệm

4) Trong Quản trị viên-> Tiện ích mở rộng-> Quản lý Tôi có thể tìm thấy plugin Cache được cài đặt

5) Trong Quản trị viên-> Tiện ích mở rộng-> Khám phá, hiện đã được tìm thấy.

6) Trên trang web trực tiếp của riêng tôi, tôi nhận được kết quả tương tự, tuy nhiên tiêu đề Cache là "Kiểm soát bộ đệm: không có bộ đệm" thay vì "Kiểm soát bộ đệm: không lưu trữ, không có bộ đệm, phải xác nhận lại, kiểm tra sau = 0, kiểm tra trước = 0 "

7) Tôi đã xây dựng một plugin bật bộ nhớ cache ngay trước khi Phản hồi được gửi:

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

Tuy nhiên, điều tôi tìm thấy là khi hàm gọi trở lại

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 lại sai.

Bất cứ ý tưởng những gì đang xảy ra ở đây?

Câu trả lời:


2

Tôi đã giải quyết vấn đề này bằng cách sử dụng trình bao bọc bộ đệm đầu ra xung quanh toàn bộ cài đặt Joomla.

Một số nền tảng:

Trong trang web này, chúng tôi đang sử dụng jSeblod, RSForm, JCHOptizes, Nonumber Joomla CDN và AceSEF. Ngoài ra còn có rất nhiều plugin. Từ một tìm kiếm mã, tôi xác định rằng hầu hết các tiện ích mở rộng dường như phát ra các tiêu đề bộ nhớ cache của riêng chúng, khiến cho không thể kiểm soát được điều này từ phối cảnh Joomla.

Tôi đã hy vọng tôi có thể xóa tất cả các tiêu đề trong OnAfterRender, nhưng như bạn có thể thấy trong câu hỏi, điều này hoàn toàn không hoạt động.

Chúng tôi cần Cache tất cả các trang bằng Varnish và lý tưởng nhất là tắt bộ đệm trong Joomla, để việc kiểm tra trực tiếp dễ dàng hơn. Chúng tôi cũng cần tắt Bộ nhớ đệm cho - Các trang có chứa RSForm - chúng tôi luôn nhúng nội dung này vào nội dung - Trang chủ, vì nó có chuyển hướng quốc gia dựa trên cơ sở GeoIP - Khi ai đó đăng nhập, cả Quản trị viên và giao diện, vì chúng tôi đang sử dụng nội dung sân khấu.

Giải pháp liên quan đến việc thiết lập tệp trả trước trong Vhost, một plugin hệ thống để xác định các trang không lưu vào bộ đệm và nội dung của tệp trả trước.

Thời gian bộ nhớ cache của chúng tôi được mã hóa ở mức 1800 giây:

Vhost:

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

Plugin hệ thống tùy chỉnh:

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

preend.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

Có rất nhiều thông tin trên trang web này http://massivescale.net/varnish-j Joomla.html

Họ nói rằng một plugin không thể giải quyết vấn đề này do cách thức của Joomla! cốt lõi được viết. Tuy nhiên, họ cung cấp một số loại hack trên trang web của họ với giá £ 70. Tôi sẽ mệt mỏi khi sử dụng nó trên một trang web có rất nhiều tiện ích bổ sung.

SEBLOD dựa trên thành phần nội dung cốt lõi nên có thể ổn. Tôi sẽ kiểm tra các plugin khác một cách riêng lẻ và nếu bạn gặp vấn đề hãy tắt chúng cùng một lúc.


Xin chào, cảm ơn nhiều. Tôi đã đi đến kết luận giống như họ và rất vui khi được công bố giải pháp của mình, thông qua một tập tin trả trước. Tôi đang tìm kiếm một câu trả lời có thẩm quyền, ví dụ như ai đó nói rằng mã Joomla nên được sửa đổi như thế nào để nó hoạt động.
jdog

Trang đó bạn đã liên kết ... Giải pháp của họ dành cho 1.5 với 1.6 / 1.7 / 2.5 không được hỗ trợ. Có lẽ không đáng để trả tiền cho. Trừ khi nó chỉ là trang đã lỗi thời, tất nhiên.
Ville Niemi

@Ville Nó cũng hoạt động với Joomla 3.x nếu bạn nhìn kỹ. Chỉ 1.6, 1.7. 2.6 không được hỗ trợ, mà tôi nghĩ là một quyết định thông minh. Tôi đã có cho mình 2 khách hàng đã chạy 1.5 cho đến gần đây. Các trang web này được xây dựng khi Joomla 2.5 mới ra mắt, nhưng Virtuemart không có sẵn. Hóa ra không kinh tế để nâng cấp chúng, nếu bạn đảm nhận vị trí mà Virtuemart không còn là một cách tốt để đi nữa. Xây dựng lại rẻ hơn.
jdog

@jdog Vậy đó chỉ là trang không cập nhật? Và vâng tôi nhớ làm 1,5 đến 2,5 lần di chuyển. Trên một trang web phức tạp, về cơ bản bạn đang cố gắng bán một trang web mới.
Ville Niemi

@Ville FAQ Bao gồm những gì trong gói $ 70? Các bản vá cho các tệp VCL Joomla 1.5, 2.5.4+, 3.0, 3.1, 3.2, 3.3, 3.4 cho Varnish 2.1+, 3.x và 4.x, một bài viết thanh lọc plugin từ bộ đệm (cho Joomla 2.5 trở lên) và 17 trang tài liệu bằng PDF, ODT và TXT. Chúng tôi cũng thêm 30 phút hỗ trợ, bao gồm cả cài đặt. Bạn thấy mọi phiên bản của excl. 1.6, 1.7, 2.5.1 / 2/3 được liệt kê
jdog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.