web-dev-qa-db-ja.com

記事を保存した後にCDNを自動的に更新する方法

私は解決策を探していますが、どのように始めればよいかわかりません。

私のすべての静的joomla HTMLサイトはCloudflareによってキャッシュされます。 joomlaの記事を更新した後、APIリクエストでCloudflareキャッシュマニュアルを更新します。

だから私はjoomlaの保存ボタンを押した後、APIリクエストを自動的に送信するソリューションを探しています。

「実際の」URLは、記事によってカスタムフィールドですでに使用可能です。

2
Lovntola

ここに私の最初のプラグインがあります:

<?php
/**
 * Plugin class for update the Cloudflare Cache after save a article
 */

class plgContentBk_onsave extends JPlugin
{

    public function onContentAfterSave ($context, $article, $isNew)
    {
    // I have saved the URL in a custom field by the article to protect against duplicate content. 
    // I use this field for <link rel="canonical" href="..."> too.
    // so I get the URl from the article:
    $context = 'com_content.article';
    $article = JModelLegacy::getInstance('Article', 'ContentModel')->getItem(); 
    JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); // Helper to get the field by the article
    $fields = FieldsHelper::getFields($context, $article);
    $fields = json_decode(json_encode($fields), true); // convert to a array
    $url = $fields[0]["value"]; // Get the URL from the Field $fields[0]["value"] the custom field in the article
    // if you want to see all your custom fields : var_dump($fields)

    // Okay now the part that delete the Cloudflare cache:

    $authKey = "XXX";
    $authEmail = "XXX";
    $zoneId = "XXX";
    $endpoint = "purge_cache";
    $data = '{"files":[
    "'.$url.'"
    ]}';
    $url = "https://api.cloudflare.com/client/v4/zones/{$zoneId}/{$endpoint}";
    $opts = ['http' => [
    'method' => 'DELETE',
    'header' => [
        "Content-Type: application/json",
        "X-Auth-Key: {$authKey}",
        "X-Auth-Email: {$authEmail}",
    ],
    'content' => $data,
    ]];

    $context = stream_context_create($opts);
    $result = file_get_contents($url, false, $context);
    // to sse the Cloudflare result use: var_dump($result);
    // add exit; to see all otputs like var_dumps
    return true;    
    }
}
 ?>

テストされ、正常に動作します。記事を保存した後、one URLのCloudflare CDNが削除されます。
どんな改善も歓迎します。
私の問題を解決するためのご支援に感謝いたします。

保存後に成功を見るために追加しました:

ob_start();
var_dump($result);
$ext = ob_get_clean();
// to see the Cloudflare result use: var_dump($result);
// add exit; to see all otputs like var_dumps
$application = JFactory::getApplication();
$message="Cloudflare Update von: ".$fields[0]["value"]."<br>".$ext; $type="notice";
$application->enqueueMessage(JText::_($message), 'notice');
3
Lovntola

私が最近これをテストしていないので、私が覚えている限り、CloudFlareで記事の更新を表示するためにCloudFlareのキャッシュをクリアする必要はありません。 CloudFlareはcss、jsなどの静的アセットのみをキャッシュします。いずれにせよ、その仕事をする既製のプラグインがあります。私がお勧めできるのは、RegularLabs Cache Cleanerです: https://www.regularlabs.com/extensions/cachecleaner/features

プラグインのProバージョンは、Joomlaバックエンドにコンテンツを保存する間、CloudFlareキャッシュのパージを自動的にサポートします。

3
FFrewin