A8DOG

A8DOG

随便写写,记录折腾过程!
telegram

WordPressは、WP Super Cache + Pythonスクリプトを使用して、強力なプリキャッシュと全体の静的化を実現します。

WordPress には定期的なタスクの仕組みがあります。WP Super Cache プラグインはこの定期的なタスクを使用してプリキャッシュを行います。私が使用している間に、プリキャッシュは最大で 10 ページ以上生成され、次回の定期的なタスクの実行時に継続的に生成されますが、非常に遅い効率です。WP Super Cache プリキャッシュページを常に保持しておくと、自動的に生成されますが、効率はまだ遅いです。そこで、WP Super Cache でプリキャッシュできないカテゴリページもキャッシュするために、簡単な Python スクリプトを作成しました。

https://img.a8dog.com/i/2024/03/25/qw5iaj.png

コード:#

まず、サーバーには Python 3 の環境が必要で、WordPress には WP Super Cache プラグインがインストールされている必要があります。以下のコードを page.py として編集し、カテゴリのページをキャッシュするために使用します。

import os
import requests
import time
from concurrent.futures import ThreadPoolExecutor
from itertools import islice

# リンクと対応する数を定義する
links = {
    "https://a8dog.com": 60,
    "https://a8dog.com/a8": 10,
}

# リンクを生成する
all_links = []
for link, count in links.items():
    for i in range(1, count + 1):
        page_link = f"{link}/page/{i}" if i > 1 else link
        all_links.append(page_link)

# リンクをチャンクに分割して並行してアクセスするために使用する関数
def chunk(it, size):
    it = iter(it)
    return iter(lambda: tuple(islice(it, size)), ())

# リンクにアクセスする関数
def visit_url(url):
    try:
        response = requests.get(url)
        print(f"Visited: {url}, Status Code: {response.status_code}")
    except Exception as e:
        print(f"Failed to visit: {url}, Error: {e}")

# 並行数と遅延を設定する
concurrency = 10  # 並行数
delay = 1  # 遅延時間(秒)

# スレッドプールを作成し、リンクに並行してアクセスする
with ThreadPoolExecutor(max_workers=concurrency) as executor:
    for chunked_links in chunk(all_links, concurrency):
        futures = [executor.submit(visit_url, url) for url in chunked_links]
        time.sleep(delay)

# リンクをpage.txtファイルに書き込む
with open("page.txt", "w") as f:
    for link in all_links:
        f.write(link + "\n")

コード中のリンクをカテゴリページに置き換えると、カテゴリのページ数に応じて設定できます。

例えば、私のカテゴリには 10 ページありますので、15 ページに設定することができます。これにより、記事やページが増えてもキャッシュができなくなることはありません。

次に、以下のコードを url.py に追加します:

import requests
import xml.etree.ElementTree as ET
import threading
import time

# 並行リクエスト数とリクエスト間隔を設定する
CONCURRENT_REQUESTS = 10
REQUEST_INTERVAL = 1  # seconds

def fetch_sitemap(url):
    """
    サイトマップのコンテンツを取得する
    """
    response = requests.get(url)
    if response.status_code == 200:
        return response.content
    else:
        print(f"Failed to fetch sitemap from {url}")
        return None

def extract_sitemap_urls(sitemap_content):
    """
    サイトマップのコンテンツからサブサイトマップのリンクを抽出する
    """
    urls = []
    if sitemap_content:
        try:
            root = ET.fromstring(sitemap_content)
            for loc in root.findall(".//{http://www.sitemaps.org/schemas/sitemap/0.9}loc"):
                urls.append(loc.text)
        except ET.ParseError as e:
            print("Error parsing sitemap XML:", e)
    return urls

def fetch_urls_from_sitemap(url):
    """
    サイトマップからウェブページのリンクを抽出する
    """
    sitemap_content = fetch_sitemap(url)
    if sitemap_content:
        return extract_sitemap_urls(sitemap_content)
    else:
        return []

def fetch_url(url):
    """
    ウェブサイトへのリクエストを送信する
    """
    try:
        response = requests.get(url)
        # ここで必要なレスポンス内容を処理する
        print("Fetched:", url)
    except requests.RequestException as e:
        print("Error fetching", url, ":", e)

def main():
    sitemap_url = "https://a8dog.com/wp-sitemap.xml"  # あなたのサイトマップのリンクに置き換える
    sitemap_urls = fetch_urls_from_sitemap(sitemap_url)
    all_urls = []

    # すべてのサブサイトマップからウェブページのリンクを抽出する
    for url in sitemap_urls:
        all_urls.extend(fetch_urls_from_sitemap(url))

    # url.txtファイルに書き込む
    with open('url.txt', 'w') as f:
        for url in all_urls:
            f.write(url + '\n')
    print("Urls extracted and written to url.txt file.")

    # 並行リクエストのスレッド関数
    def fetch_urls(urls):
        while urls:
            url = urls.pop(0)
            fetch_url(url)
            time.sleep(REQUEST_INTERVAL)

    # CONCURRENT_REQUESTS個のスレッドで並行してリクエストを送信する
    threads = []
    for _ in range(CONCURRENT_REQUESTS):
        thread = threading.Thread(target=fetch_urls, args=(all_urls,))
        thread.start()
        threads.append(thread)

    # すべてのスレッドの完了を待つ
    for thread in threads:
        thread.join()

if __name__ == "__main__":
    main()

サイトマップのアドレスをあなたのサイトマップのアドレスに置き換えると、ウェブサイトのすべてのリンクが自動的にキャッシュされます。

もし CDN やファイアウォールがある場合、頻繁なプリキャッシュによりブロックされる可能性がありますので、IP をホワイトリストに追加し、ホストファイルを変更してドメインを元の IP または 127.0.0.1 に向ける必要があります。これにより、CDN のトラフィックを消費することはありません。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。