首頁 後端開發 php教程 使用 ETag 進行 Web 優化。 WordPress 範例

使用 ETag 進行 Web 優化。 WordPress 範例

Sep 09, 2024 pm 04:30 PM

使用 ETag 進行網頁最佳化。 WordPress 範例

這篇文章最初發表於 2014 年,2019 年發表在《Web Optimization with ETags》。 WordPress 範例

Optimización web con ETags. Ejemplo con WordPress

我有一段時間沒有寫關於最佳化的文章了。你已經知道你認識我了,為什麼會這樣。但是,我不能讓所謂的WPO小販阻止我寫一些我喜歡的東西。所以,你有一個新帖子。

我確信這件事發生在你身上。有一天,您到達工作場所,打開計算機,打開電子郵件,查看後打開終端並輸入:git pull。終端的回應不會等待:已經是最新的..

你有沒有想過 git pull 背後發生了什麼事?我願意。猜測,我想說,透過執行 git pull,您可以透明地將您上次更改的日期發送到伺服器。儲存庫會檢查您發送的最後一次變更的日期與它所具有的最後一次變更的日期,以便:

  • 如果您的日期較舊,它會向您發送自那時以來所做的所有推送/更改。它還會向您發送這些更改以及更改的日期。因此,如果您再次編寫 git pull,您將發送最後一次更改的日期,一切都會重新開始。
  • 如果您的日期與儲存庫上次變更的日期一致,它將返回您擁有最新的所有內容。

這個程式對我來說是最符合邏輯的,但它並不是真正的程式。真實的很相似,但不完全一樣。每次推動完成。儲存庫將一個令牌(字母數字識別代碼,例如 ae3d9735f280381d0d97d3cdb26066eb16f765a5)與上次提交相關聯。當您執行 git pull 時,會將您擁有的最後一個令牌與他擁有的令牌清單進行比較。如果您的令牌是舊令牌,它會向您發送此後的變更及其相應的令牌。如果令牌是最後一個,它會告訴您您是最新的。

此時,您會告訴我:Manuel,但這篇文章不是關於使用 WordPress 優化網站的嗎?當然,現在仍然如此。第一種情況(日期的情況)和第二種情況(令牌的情況)都是 HTTP 協定的工作方式。來看看吧。

最後修改時間

想像一下,您的瀏覽器向我的伺服器發送請求以下載我網站的圖示。從我的伺服器到您的瀏覽器的回應中將包含字串(或 HTTP 標頭):Last-Modified: Thu, 29 Dec 2016 11:55:29 GMT。有了它,我的伺服器就會通知您的瀏覽器上次修改網站圖示的時間。因此,下載映像後,瀏覽器會將其保存在快取中,元資料為“Last-Modified”,值為 Thu, 29 Dec 2016 11:55:29 GMT

如果幾秒鐘、幾天或幾個月後,您決定再次進入我的網站,您的瀏覽器將再次需要我網站的圖示。但是,請記住,它的快取中還有該圖像的副本。您如何知道快取的圖示是否是最新的,或者是否需要再次下載?很簡單,執行「git pull」。也就是說,瀏覽器再次向我的伺服器發送圖示請求,但通知它具有特定日期的圖像版本。我的伺服器有兩個可能的答案:

  • 我的網站上現在使用的圖標較新,因此我的伺服器會將新圖像發送到您的瀏覽器,以及該新圖像的新的最後修改日期。
  • 我網站上現在使用的圖示與您的瀏覽器顯示的日期相同。也就是說,伺服器圖像和瀏覽器快取圖像是相同的。然後,我的伺服器告訴您的瀏覽器該圖像尚未修改(HTTP 代碼為 304 Not Modified)。然後,您的瀏覽器將使用快取中的圖像,從而不必再次下載圖像(從而節省大量資料速率位元組)。

電子標籤

如果您還記得,在文章開頭,我告訴過您 Git 使用令牌來決定何時進行更改。除了上次修改日期之外,HTTP 還允許您使用稱為 ETag(實體標籤)的令牌。 ETag 是一個字母數字代碼(例如 5864f9b1-47e),沒有預設格式(即 HTTP 標準沒有指定或幾乎沒有指定令牌應具有的格式)。網站的所有者決定其格式。

預設情況下,Apache 等 Web 伺服器會根據每個檔案的修改日期(有時會根據檔案大小)建立每個檔案的 ETag。這是多餘的(最後修改日期 HTTP 標頭基於相同的標準)並且不是最佳的(因為它向請求添加了更多無用的信息)。在這種情況下,建議設定您的 Web 伺服器,使其不對檔案使用 ETag。例如,要停用 Apache 的檔案 ETag(或 FileETag),請將以下程式碼新增至 tú.htacess:FileETag None

我確信您想知道使用 ETag 的瀏覽器/伺服器之間的對話是否與我們在上次修改日期中看到的相同,並且使用這兩種形式不是最佳且多餘的。為什麼要使用 ETag?

修改日期足以滿足對文件的 HTTP 請求,但對網頁 (HTML) 的 HTTP 請求則不夠。網頁取決於許多相互關聯的因素/元素(內容、評論、HTML 結構…),而不是單一文件。因此,很難找到所有這些元素的統一的最後修改日期。我知道我說的很難理解,我會嘗試用另一種方​​式解釋:

想像一下,我將條目文字的修改日期指定為該條目的網頁(HTML)的修改日期。您的瀏覽器在輸入時會快取此頁面以及貼文的最後修改日期。如果您在一分鐘後重新登錄,由於帖子沒有更改(因此其修改日期也沒有更改),您的瀏覽器將返回使用快取版本。如果有人給我寫了評論,而你回來了,你就看不到這則評論了。好吧,帖子的文字沒有改變,因此最後修改日期也沒有改變,所以你的瀏覽器會再次向你顯示快取中的版本。如果我更改 HTML 並添加新的 CSS,也會發生相同的事情。貼文內容沒有改變,日期也沒有改變,你的瀏覽器將繼續顯示快取版本。

如果我們不使用帖子上次修改的日期,而是為帖子的網頁分配一個具有以下格式的 ETag:{fecha_modificacion_contenido_post}_{date_last_commentario_post}_{number_version_del_tema_WP}

當您的瀏覽器第一次輸入貼文時,它將快取網頁(HTML)及其關聯的 ETag 作為元資料。如果您變更了任何標記條件(修改後日期、最後評論日期或目前 WP 主題版本),則與網頁關聯的 ETag 將會不同。因此,如果您再次輸入帖子,我的伺服器會通知您瀏覽器的 ETag 不是最新的,並將再次向您發送整個網頁以及新的 ETag。

如果沒有任何變化,令牌/ETag 將是相同的(在瀏覽器和伺服器上),因此當您使用瀏覽器造訪該頁面時,我的伺服器會向您發送304,讓您知道沒有任何變更已更改(用WPO 術語來說,它仍然是新鮮的),因此使用快取中的版本。

電子標籤的好處

到目前為止我還沒提到的是 ETag 的好處。以下是其中一些:

  • 伺服器/瀏覽器之間傳輸的資料較少。這意味著保存用戶數據,這樣您的網站就不會為您的用戶和伺服器花費太多費用(如果您根據傳輸數據量的費用簽訂了託管合同,這一點很重要)。
  • 伺服器不必產生 HTML,這意味著:節省記憶體和 CPU 並釋放工作資料庫。
  • 網站載入速度更快,進而改善使用者體驗。

WordPress 外掛

我們所看到的一切都是高水平的,我們將看到一個使用 ETag 進行 WordPress 頁面/帖子的小插件。

# etags.php
<?php

namespace trasweb\webperf\ETags;

/*
 * Plugin Name:       ETags en posts
 * Plugin URI:        https://trasweb.net/webperf/optimizacion-web-con-etags
 * Description:       Usa el cache en navegador para tus posts.
 * Version:           0.0.1
 * Author:            Manuel Canga / Trasweb
 * Author URI:        https://trasweb.net
 * License:           GPL
 */

add_action('wp', function () {
    if (is_admin() || ! is_singular()) {
        return;
    }

    $etag_from_navigator = $_SERVER[ 'HTTP_IF_NONE_MATCH' ]??'';
    $current_ETag        = get_current_ETag();

    if ($etag_from_navigator === $current_ETag) {
        status_header(304);
        exit;
    }

    header('ETag: ' . $current_ETag);
});

function get_current_ETag()
{
    $last_modified_time_of_content = (int)get_post_time();
    $date_of_last_comment          = get_date_of_last_comment();
    $theme_version                 = wp_get_theme()[ "Version" ]??'0.0.0';

    return md5("{$last_modified_time_of_content}_{$date_of_last_comment}_{$theme_version}");
}

function get_date_of_last_comment()
{
    $query = [
        'post_id' => get_the_ID() ?: 0,
        'orderby' => ['comment_date_gmt'],
        'status'  => 'approve',
        'order'   => 'DESC',
        'number'  => 1,
    ];

    $last_comment = get_comments($query)[ 0 ]??null;

    return $last_comment->comment_date_gmt??0;
}
登入後複製

先聲明這個外掛只是訓練。與任何 Web 優化技術一樣,例如 CSS/JS 資源的縮小/統一或伺服器端快取的使用,首先需要對網站進行研究。

如您所見,這再簡單不過了。首先,如果有的話,取得瀏覽器的ETag(第20行)。其次,取得與目前貼文/頁面關聯的 Etag(第 21 行)。

如果兩者相同,則會傳送 304 程式碼(第 24 行,即本文主圖所示的情況),然後執行結束。瀏覽器將收到代碼 304,並知道它必須使用其快取中的頁面版本。

如果Etag不同(要么是因為瀏覽器第一次進入,要么是因為token發生了變化),則將ETag發送到瀏覽器,並且允許WP繼續其進程(發送當前帖子的內容)/頁) 。

Etag 是在 get_current_ETag 函數(第 31 到 38 行)中根據帖子/頁面的上次修改時間、帖子的最後評論日期和當前主題的版本生成的。如果這些參數中的任何一個發生變化,令牌就會發生變化,迫使瀏覽器下載網站的新版本。

這就是全部。我希望您喜歡它,它可以幫助您使您的網站更快。


請分享

以上是使用 ETag 進行 Web 優化。 WordPress 範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1266
29
C# 教程
1239
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? 什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用? Apr 09, 2025 am 12:09 AM

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

解釋self ::,parent ::和static :: in php oop中的區別。 解釋self ::,parent ::和static :: in php oop中的區別。 Apr 09, 2025 am 12:04 AM

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

PHP如何安全地上載文件? PHP如何安全地上載文件? Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

See all articles