2016-06-14 48 views
6

Drupal 8:如何以編程方式爲Drupal 8中的模塊設置緩存期限?

我有一個代碼塊成功地完成它的工作並返回它。該塊被稱爲「RacerProfile」,並將其所有內容轉儲到變量「$ pageContent」中。最後它返回#markup。好。現在我怎麼告訴這個讓每六個小時失效?

/** 
* 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 ,], 
    ); 

    } 
} 

在其他Drupal的答案,我已經看到了「D8具有高速緩存標記和背景,如果有新的變化,這將自動失效塊。」很好,但我的代碼正在檢查第二個數據庫。 Drupal無法知道那裏發生了什麼變化。 (顯然沒有檢查。)那麼如何添加指定超時的緩存標記? (或者做緩存標籤甚至做到這一點?)我找不到例子。

備註:

- 上面的代碼不會產生所需的結果。該頁面對匿名用戶是靜態的。它只會在用戶/管理員通過Web管理員清除緩存時纔會更改。

- 顯然,這與配置>性能>緩存>頁面緩存最大使用期限的管理區域內的最大緩存使用期限無關。我不希望這適用於整個網站,只是這個塊。此外,該設置顯然無法控制緩存的這個方面,而是緩存到渲染頁面頭部的緩存信息。

- 顯然,這與settings.php無關,因爲我再也不想讓它適用於整個站點,並且各個模塊都有不同的超時要求。

- 該網站的流量相對較低,因此如果每天渲染一個東西四次,即使只需要每天完成一次也不是問題。每六個小時意味着在人們在四個時區中醒來之前它已經改變。大多。 ;)我明確表示,在我擔心優化負載或使用率之前,我有興趣開展此項工作。

- 我有不同的過期期限的多個自定義塊。

- 我當然已經用它搜索了很多,並且還沒有找到指定模塊塊的特定(以時間單位測量)超時的示例。即使在Drupal.org上的D8模塊示例中,也需要爲匿名用戶控制其緩存。沒有賬號的人,「公衆」瀏覽該網站。

回答

1

要將塊的渲染陣列,您可以添加緩存設置:這裏

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

時間以秒爲單位。另請參閱:https://www.drupal.org/developing/api/8/cache/max-age

如果您確實需要觸發重置的提示,則可以使用其他一些caching controls。這聽起來像你對何時需要緩存什麼有清楚的認識,因此探索緩存API中的資料可能值得你花時間。

鑑於您正在從第二個數據庫中提取數據,您可能還需要探索BigPipe,這不是您詢問的內容,而是針對需要花費一些時間來收集所有信息的用例給定頁面。可能使用通過BigPipe構建的塊將提供比在Drupal中緩存一段固定時間的數據(整個緩存引擎已重建以允許我們擺脫該模式)更好的用戶體驗。

+1

我試過這個解決方案,它似乎不工作。 – Anders8

+0

您是否啓用了緩存調試以查看緩存的內容(https://www.drupal.org/developing/api/8/response/cacheable-response-interface#debugging)?你使用這個塊是什麼阻止緩存? – acrosman

+0

我也有這個確切的問題(我的緩存標籤是「外部」,所以我想爲此頁面響應設置特定的最大年齡)。設置最大年齡緩存數據不起作用,因爲在計算頁面的過期標題時,「PageCache.php」文件會忽略它。參見該類的函數'fetch'。 – Brian

0

原來這是一個「重大」漏洞在D8那就是BEING上工作:https://www.drupal.org/node/2352009

總之,內部頁緩存模塊會忽略「最大年齡」冒泡緩存元數據從渲染陣列財產。

即使你使用內部頁面緩存模塊,而是一些外部緩存如Varnish,最大年齡HTTP標頭總是正好被設置爲任何你在「頁面緩存最大年齡」已配置的性能設置。請參閱https://www.drupal.org/node/2732129,如有需要,該解決方法有一個解決方法。

相關問題