2016-06-14 11 views
6

Drupal 8:Làm cách nào để đặt độ tuổi bộ nhớ cache theo chương trình cho mô-đun trong Drupal 8?

Tôi có mã cho một khối làm việc thành công và trả lại. Khối này được gọi là "RacerProfile" và nó đổ tất cả nội dung của nó vào biến "$ pageContent". Cuối cùng nó trả về #markup. Được. Bây giờ làm thế nào để tôi nói điều này để làm mất hiệu lực mỗi sáu giờ?

/** 
* Provides a 'Racer Profile' Block 
* 
* @Block(
* id = "racer_profile", 
* admin_label = @Translation("Slider v1 block") 
*) 
*/ 
class RacerProfile extends BlockBase { 
    /** 
    * {@inheritdoc} 
    */ 
    public function build() 
    { 
    // does all the work to make $pageContent via non-drupal 
    // database queries. However, for this example, let's just 
    // just imagine it gets the time of day. Then, let's set 
    // let's set the cache age to 5 seconds so F5-F5-F5-F5... should 
    // show 12 changes per minute on a repeatable schedule 

    $pageContent.= "<p> Date and Time: " . date("F jS Y h:i:s A"); 
    return array(
     '#markup' => $pageContent, 
     '#cache' => ['max-age' => 5 ,], 
    ); 

    } 
} 

Trong các câu trả lời khác của Drupal, tôi đã thấy "D8 có thẻ nhớ và ngữ cảnh sẽ tự động vô hiệu hóa khối nếu có điều gì đó thay đổi". Tốt, nhưng mã của tôi đang kiểm tra một cơ sở dữ liệu thứ hai. Không có cách nào để Drupal biết những gì đang thay đổi ở đó. (Nếu không kiểm tra, rõ ràng.) Vậy làm cách nào để thêm thẻ bộ nhớ cache với thời gian chờ được chỉ định? (Hoặc làm thẻ nhớ cache thậm chí làm điều đó?) Tôi không thể tìm thấy ví dụ.

Ghi chú:

-Mã trên không tạo ra kết quả mong muốn. Trang tĩnh đối với người dùng ẩn danh. Nó chỉ thay đổi khi người dùng/quản trị xóa bộ nhớ cache thông qua quản trị viên web.

- Rõ ràng, điều này không liên quan đến tuổi Cache tối đa trong khu vực quản trị của Cấu hình> Hiệu suất> Caching> Độ tuổi tối đa của bộ đệm trang. Tôi không muốn điều này áp dụng cho toàn bộ trang web, chỉ là khối này. Ngoài ra, cài đặt đó dường như không kiểm soát khía cạnh này của bộ đệm ẩn, nhưng thay vào đó thông tin bộ nhớ cache được plopped vào tiêu đề của các trang được hiển thị.

- Rõ ràng, điều này không liên quan đến settings.php theo bất kỳ cách nào, vì tôi không muốn áp dụng cho toàn bộ trang web và các mô-đun khác sẽ có các yêu cầu hết thời gian chờ khác nhau.

-Các lưu lượng truy cập cho trang web có khối lượng tương đối thấp, vì vậy nếu hiển thị một thứ bốn lần một ngày, ngay cả khi chỉ cần thực hiện một lần mỗi ngày thì không phải là vấn đề. Cứ sáu giờ một lần có nghĩa là nó đã thay đổi trước khi mọi người thức dậy qua bốn múi giờ. Chủ yếu là. ;) Tôi tuyên bố rõ ràng ở đây rằng tôi quan tâm đến việc có công việc này trước khi tôi lo lắng về việc tối ưu hóa tải hoặc sử dụng.

-Tôi có nhiều khối tùy chỉnh với các khoảng thời gian hết hạn khác nhau.

-Tôi chắc chắn đã googled nó rất nhiều, và chưa tìm thấy ví dụ xác định cụ thể (đo trong một đơn vị thời gian) timeout cho một khối mô-đun. Ngay cả trong các ví dụ về mô-đun D8 trên drupal.org

-Điều quan trọng, khối cần phải có bộ nhớ cache được kiểm soát cho người dùng ẩn danh. Những người không có tài khoản, "công chúng" duyệt trang web.

Trả lời

1

Để làm cho mảng bạn có thể thêm các thiết lập bộ nhớ cache của khối của bạn:

'#cache' => [ 
    'max-age' => 60 * 60 * 24, 
], 

Thời gian ở đây được đo bằng giây. Xem thêm: https://www.drupal.org/developing/api/8/cache/max-age

Nếu bạn có gợi ý về những thứ cần kích hoạt đặt lại, bạn có thể sử dụng một số khác caching controls. Có vẻ như bạn có ý thức rất rõ ràng về những gì bạn muốn lưu trong bộ nhớ cache ở đâu và khi nào, vì vậy việc khám phá các tài liệu trên API bộ nhớ cache có lẽ đáng để bạn dành thời gian.

Vì bạn đang kéo từ cơ sở dữ liệu thứ hai, bạn cũng có thể muốn khám phá BigPipe, không phải là những gì bạn hỏi, nhưng có nghĩa là trường hợp sử dụng sẽ mất một thời gian để thu thập tất cả thông tin trang đã cho.Có khả năng sử dụng các khối được xây dựng qua BigPipe sẽ cung cấp trải nghiệm người dùng tốt hơn so với dữ liệu được lưu trong Drupal trong một khoảng thời gian cố định (toàn bộ bộ nhớ cache được xây dựng lại để cho phép chúng tôi thoát khỏi mẫu đó).

+1

Tôi đã thử giải pháp này, có vẻ như nó không hoạt động. – Anders8

+0

Bạn đã bật gỡ lỗi bộ nhớ cache để xem những gì đang được lưu vào bộ nhớ cache (https://www.drupal.org/developing/api/8/response/cacheable-response-interface#debugging)? Bạn có sử dụng khối này là những gì ngăn chặn bộ nhớ đệm? – acrosman

+0

Tôi cũng có vấn đề chính xác này (thẻ bộ nhớ cache của tôi là "bên ngoài" vì vậy tôi muốn đặt độ tuổi tối đa cụ thể cho phản hồi trang này thay thế). Đặt dữ liệu bộ nhớ cache tối đa không hoạt động vì tệp 'PageCache.php' bỏ qua nó khi tính toán tiêu đề hết hạn cho trang. Xem hàm 'fetch' của lớp đó. – Brian

0

Hóa ra đây là một "lớn" lỗi trong D8 đó là được làm việc trên: https://www.drupal.org/node/2352009

Nói tóm lại, các mô-đun nội Page Cache hiện lờ đi "max-age" tài sản của bọt lên siêu dữ liệu cache từ làm cho mảng .

Thậm chí nếu bạn đã không sử dụng các mô-đun nội Page Cache và thay vào đó một số bộ nhớ cache bên ngoài như Varnish, tiêu đề HTTP max-age luôn chỉ cần đặt để bất cứ điều gì bạn đã cấu hình trong "thời trang bộ nhớ cache tối đa" trong việc thực hiện cài đặt. Xem https://www.drupal.org/node/2732129 có giải pháp thay thế nếu cần.

Các vấn đề liên quan