如何結合Python和Redis以提升WordPress效能

如何結合Python和Redis以提升WordPress效能

在 Python 世界中,許多開發人員都喜歡 NoSQL 資料庫 Redis,因為它速度快,而且有各種強大的客戶端庫。在 WordPress 世界中,當需要持久物件快取以加快後端資料訪問速度時,Redis 通常是首選技術。

在使用 Python 應用程式處理 WordPress 內容時,您可以將這兩個世界結合起來。

在本教程中,我們將演示如何通過構建一個使用流行的 redis-py 庫的 Python 應用程式將內容直接釋出到 Redis,以及如何通過 WordPress REST API 釋出內容。

什麼是 Redis?

Redis 或遠端字典伺服器是一種快速 NoSQL 資料庫和記憶體快取,由 Salvatore Sanfilippo 開發,Redis 有限公司(前身為 Redi Labs)維護。(前身為 Redi Labs)維護。Redis 的開源版本採用 Berkeley Source Distribution (BSD) 許可,Redis 有限公司還提供該伺服器的商業企業版和雲版本。

Redis 與其他 NoSQL 資料庫的區別在於其資料儲存機制。它通常被稱為資料結構儲存,因為它儲存的資料與許多程式語言中的資料型別相同,包括字串、集合、列表和字典(或雜湊值)。除了支援簡單結構外,Redis 還支援高階資料結構,可用於地理定位和流處理等任務。

Python 應用的先決條件

在開始建立應用程式之前,您需要在本地安裝以下三個專案:

安裝好先決條件後,就該讓一切運轉起來了。具體來說,您要建立一個 Python 應用程式,以字典格式獲取使用者的 WordPress 帖子,並將其儲存到 Redis 快取中。

建立 Python 應用將帖子儲存到 Redis 快取中

Redis 快取是一種高效的網站快取機制。它能儲存經常請求的資訊,以便更快、更方便地訪問。快取以鍵值資料結構儲存資訊。

首先,為你的專案建立一個名為 python-redis 的新資料夾。然後,啟動命令終端cdpython-redis 並執行以下命令安裝 redis-py:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install redis
pip install redis
pip install redis

安裝完成後,在 python-redis 目錄下新建一個名為 main.py 的檔案。用你喜歡的文字編輯器開啟該檔案,輸入下面的程式碼塊。

首先匯入新安裝的 redis-py 庫,並設定 Redis 主機和埠地址:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import redis
redis_host = 'localhost'
redis_port = 6379
import redis redis_host = 'localhost' redis_port = 6379
import redis
redis_host = 'localhost'
redis_port = 6379

現在,將 WordPress 帖子的值定義為字典中的鍵/值對。下面是一個例子:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
post = {
'ID': 1,
'post_author': 1,
'post_date': '2024-02-05 00:00:00',
'post_date_gmt': '2024-02-05 00:00:00',
'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'post_title': 'My first post',
'post_excerpt': 'In this post, I will...',
'post_status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'post_password': 'my-post-pwd',
'post_name': 'my-first-post',
}
post = { 'ID': 1, 'post_author': 1, 'post_date': '2024-02-05 00:00:00', 'post_date_gmt': '2024-02-05 00:00:00', 'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>', 'post_title': 'My first post', 'post_excerpt': 'In this post, I will...', 'post_status': 'publish', 'comment_status': 'open', 'ping_status': 'open', 'post_password': 'my-post-pwd', 'post_name': 'my-first-post', }
post = {
'ID': 1,
'post_author': 1,
'post_date': '2024-02-05 00:00:00',
'post_date_gmt': '2024-02-05 00:00:00',
'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'post_title': 'My first post',
'post_excerpt': 'In this post, I will...',
'post_status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'post_password': 'my-post-pwd',
'post_name': 'my-first-post',    
}

注:在實際應用中,帖子內容可能來自 HTML 輸入表單。

在程式碼中新增 redis_dict() 函式,該函式將連線本地 Redis 伺服器,將上述帖子儲存到 Redis 快取中,並將成功建立的值列印到控制檯:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def redis_dict():
try:
r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True)
r.hset("newPostOne", mapping=post)
msg = r.hgetall("newPostOne")
print(msg)
except Exception as e:
print(f"Something went wrong {e}")
# Runs the function:
if __name__ == "__main__":
redis_dict()
def redis_dict(): try: r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True) r.hset("newPostOne", mapping=post) msg = r.hgetall("newPostOne") print(msg) except Exception as e: print(f"Something went wrong {e}") # Runs the function: if __name__ == "__main__": redis_dict()
def redis_dict():
try:
r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True)
r.hset("newPostOne", mapping=post)
msg = r.hgetall("newPostOne")
print(msg)
except Exception as e:
print(f"Something went wrong {e}")
# Runs the function:
if __name__ == "__main__":
redis_dict()

除非你在 Docker 中啟動了 Redis,否則請使用以下命令呼叫 Redis 命令列介面:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
redis-cli
redis-cli
redis-cli

現在執行 Python 指令碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python main.py
python main.py
python main.py

執行指令碼後,帖子就會新增到 Redis 的鍵值儲存中。你應該能在終端控制檯看到以下響應:

控制檯輸出顯示 Python 應用程式帖子已新增到 Redis 儲存中

控制檯輸出顯示 Python 應用程式帖子已新增到 Redis 儲存中

您已經成功地在本地 Redis 資料庫中儲存了一篇文章。

現在,讓我們使用 WordPress REST API 將帖子上傳到 WordPress 網站,並將其儲存在預設的 MariaDBMySQL 資料庫中,而不是 Redis 中。

使用 REST API 向 WordPress 上傳帖子

WordPress REST API提供了一組端點,您可以從應用程式中呼叫這些端點與WordPress互動。我們使用 post 端點在 WordPress 中建立一個帖子。

第 1 步:在 WordPress 中設定應用程式密碼

WordPress API需要一個應用程式密碼,以允許您的應用程式訪問WordPress網站的資料。密碼是一個 24 個字元的金鑰,您必須將其包含在對 REST API 的每個請求中。

在WordPress控制面板的使用者個人資料頁面上生成應用程式密碼。您可以為每個應用程式密碼指定一個使用者友好的名稱,但在生成密碼後,您將無法檢視密碼本身(所以現在就複製一份):

在 WordPress 控制面板中生成應用程式密碼

在 WordPress 控制面板中生成應用程式密碼

注:WordPress 需要安全連線才能在生產環境中訪問 REST API。如果你的開發環境無法使用 SSL 連線,你可能需要在 wp-config.php 中新增以下一行,”強制” WordPress 忽略安全限制:

define( 'WP_ENVIRONMENT_TYPE', 'local' );

第 2 步:使用 Python 應用程式向 WordPress 發帖

首先,安裝用於向 WordPress API 傳送 HTTP 請求的 Python 請求庫。為此,在終端上執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install requests
pip install requests
pip install requests

然後,在 python-redis 資料夾中新建一個名為 app.py 的檔案。然後,用文字編輯器開啟該檔案。

首先匯入 requestsjsonbase64 模組:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import requests
import json
import base64
import requests import json import base64
import requests
import json
import base64

定義 API 基本 URL 以及 WordPress 使用者名稱和密碼。對於密碼變數,請使用您在 WordPress 中生成的應用程式密碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
url = 'http://localhost/wp-json/wp/v2'
user = '<Your username here>'
password = '<Your application password here>'
url = 'http://localhost/wp-json/wp/v2' user = '<Your username here>' password = '<Your application password here>'
url = 'http://localhost/wp-json/wp/v2'
user = '<Your username here>'
password = '<Your application password here>'

現在,連線 user 和 password,對結果進行編碼,並將其傳遞到請求標頭:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
creds = user + ":" + password
token = base64.b64encode(creds.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}
creds = user + ":" + password token = base64.b64encode(creds.encode()) header = {'Authorization': 'Basic ' + token.decode('utf-8')}
creds = user + ":" + password
token = base64.b64encode(creds.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}

這是帖子正文:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
post = {
'author': 1,
'date': '2024-02-05 00:00:00',
'date_gmt': '2024-02-05 00:00:00',
'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'title': 'My second post',
'excerpt': 'In this post, I will...',
'status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'password': 'my-post-pwd',
'slug': 'my-second-post',
}
post = { 'author': 1, 'date': '2024-02-05 00:00:00', 'date_gmt': '2024-02-05 00:00:00', 'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>', 'title': 'My second post', 'excerpt': 'In this post, I will...', 'status': 'publish', 'comment_status': 'open', 'ping_status': 'open', 'password': 'my-post-pwd', 'slug': 'my-second-post', }
post = {    
'author': 1,
'date': '2024-02-05 00:00:00',
'date_gmt': '2024-02-05 00:00:00',
'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'title': 'My second post',
'excerpt': 'In this post, I will...',
'status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'password': 'my-post-pwd',
'slug': 'my-second-post',    
}

設定嚮應用程式介面發出的 POST 請求和列印響應狀態的命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
r = requests.post(url + '/posts', headers=header, json=post)
print(r)
r = requests.post(url + '/posts', headers=header, json=post) print(r)
r = requests.post(url + '/posts', headers=header, json=post)
print(r)

在終端中使用以下命令執行指令碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python app.py
python app.py
python app.py

如果收到 201 響應(”已建立”),則表示資源已成功新增。

釋出成功後會返回 201 響應程式碼

釋出成功後會返回 201 響應程式碼

您可以在 WordPress 儀表盤或網站的 MySQL/MariaDB 資料庫中確認這一點。

在 WordPress 中直接使用 Redis 快取

WordPress 網站可以使用 Redis 快取臨時儲存物件,如帖子、頁面或使用者。需要時,可以從快取中訪問物件。這種方法節省了寶貴的時間,減少了延遲,並提高了網站的擴充套件能力和處理更多流量的能力。

需要在你的 WordPress 網站上安裝一個專用外掛

例如,讓我們在本地 WordPress 網站上安裝 Redis Object Cache 外掛。

Redis 物件快取外掛

Redis 物件快取外掛

用文字編輯器開啟 wp-config.php 檔案,在自定義配置變數部分新增以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_CLIENT', 'predis'); define('WP_REDIS_HOST', 'localhost'); define('WP_REDIS_PORT', '6379');
define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');

注:Redis 主機地址取決於伺服器配置。

在 WordPress 面板中導航至設定 > Redis。您應該會看到類似下面的內容:

Redis 物件快取外掛顯示在 "設定" 選項卡中

Redis 物件快取外掛顯示在 “設定” 選項卡中

現在,Redis 快取已經成功取代了之前的 MySQL 資料庫。

此外,前臺 WordPress 網站使用的快取與後臺 Python 應用程式使用的快取相同。您可以開啟一個新終端並執行以下命令來測試這一點:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
redis-cli monitor
redis-cli monitor
redis-cli monitor

瀏覽網站時,網站請求將輸出到命令提示符:

使用 redis-cli 在終端監控伺服器請求

使用 redis-cli 在終端監控伺服器請求

現在前後端已經同步,你可以使用 Python 應用程式通過 REST API 向 WordPress 新增新文章。

為此,請修改 app.py 中的 POST 物件,使其包含新文章,然後執行 python app.py,將文章新增到快取中。

小結

在本文中,我們學習瞭如何使用 Redis Python 客戶端將 Redis 資料庫連線到 Python 應用程式。該客戶端支援多種 Redis 資料儲存格式:列表、集合、字典和其他命令資料型別。

我們還看到了如何通過 REST API 和 Redis Object Cache 外掛將 Redis 整合到 WordPress 網站中。

在網站中使用 Redis 記憶體快取的功能使其成為一種強大而靈活的開發工具。Redis 在提高資料庫查詢速度、網站效能和總體使用者體驗方面異常有效。

評論留言

脣槍舌劍 (1)

  • mrbeanem的頭像

    mrbeanem

    2024.5.9 08:05

    thanks

    回覆