web-dev-qa-db-ja.com

リモートのtxtファイルから文字列を定期的に削り取ってキャッシュする方法。 - 私の最初のプラグイン

私はリソースのウェブサイト、 FilterLists を管理しています。これは基本的にネット上でホストされているtxtファイルのディレクトリです。私は(a)学習し、(b)このツールに新しい機能を追加するために私の最初のWordPressプラグインを構築しようとしています。

私は、リンクされた各テキストファイルの最終更新時刻を(作者によって実際のテキストで提供されているように)スクレイピングしようとしています。現状では、プラグインでの最初のパスは正しく機能しますが、訪問者(または私の場合はCDNが数時間ごと)がサイトを要求した時点ですべてのスクレイピングと解析が行われます。リストされているすべてのファイルに対して。理想的には、おそらくwp-cron(それが存在することを知っていること以外は慣れていない)のようなものを使用して定期的に各ファイルに定期的にpingを送りたいと思います。最終更新日のすべてを1日に1回程度更新できれば、それで十分です。

これがこれまでのところ プラグイン で、上にリンクされたFilterListsサイトの最初の5つのtxtリンクで実際に動作しているのがわかります。

ページ要求時ではなく定期的に日付をスクレーピングするように正しい方向に私を向けることができますか?

私はPHPとWPの開発が初めてなので、冗長性を歓迎します。

ありがとう。

1
Collin Barrett

一時API がここで役に立ちます。トランジェントは定義された時間の間可変的に保存されます。

function filemtime_remote( $url )
{
    $list = file_get_contents( $url , null , null , 0 , 200);
    $important = explode("Last modified: ",$list)[1];
    $mydate = substr($important, 0, 21);
    return $mydate;
}

上記は、ページがロードされるたびに「最終更新日」を探す現在のコードです。

あなたはそれをに変換することができます:

function filemtime_remote( $url ){   
        # Get the transient
        $mydate = get_transient( 'lm_' . esc_url( $url ) );

        if( false === $mydate ) {
            # The transient expired or does not exist, so we fetch the last modified again
            $list = file_get_contents( $url , null , null , 0 , 200);
            $important = explode("Last modified: ",$list)[1];
            $mydate = substr($important, 0, 21);

            # We then save that date in a transient(which we can prefix with something like "lm_")
            # We are saving the transient for 12 hours
            set_transient( 'lm_' . esc_url( $url ), $mydate , 12 * HOUR_IN_SECONDS );
        }

        return $mydate;
    }

試したことはありませんが、論理は次のとおりです。 get_transient() を使用して、過去12時間に記録された値があるかどうかを確認します。値がある場合(返される値はFALSEにはなりません)、その値を使用してください。値がない場合(返される値はFALSE)、次にデータを要求してから set_transient() を使用して一時的に保存します。 12時間で期限が切れます。

1
RRikesh