Очистка кеша Cloudflare через их API в php - PullRequest
0 голосов
/ 10 мая 2019

Я столкнулся с этой проблемой на сайте друга. Это установка Wordpress с несколькими плагинами. Один из этих плагинов используется для обновления нескольких изображений (сбор их из удаленных мест и их локальное хранение для экономии пропускной способности). Но при запуске плагина веб-сайт, по-видимому, отказывался отображать обновленные изображения и непрерывно выдавал мне старую версию, которой определенно больше не было на сервере.

Кеш браузера был исключен быстро как причина. Wordpress может быть немного сложнее, поэтому я проверил все остальные плагины, вставки и была ли активна какая-либо форма кеширования объектов. После того, как я исключил это, мне пришло в голову, что хостинг-провайдер должен быть проблемой. Я не знал, и мне пришлось выяснить, что они используют Cloudflare в качестве поставщика DNS, чтобы иметь действительный сертификат SSL для своего веб-сайта. Однако по умолчанию Cloudflare также поставляется с кэшированием, которое может быть довольно агрессивным.

Так как им понравилось кэширование, и они хотели, чтобы оно было включено, я сказал своему другу, чтобы он очищал кэш вручную в Cloudflare. Та-Да - обновленные изображения показывались так, как должны.

Поэтому, чтобы избежать процесса входа в Cloudflare при каждом вызове плагина, я искал способ использовать их API, чтобы решить эту проблему удобным способом. Мне нужен был php-код (для интеграции в плагин Wordpress) ...

1 Ответ

1 голос
/ 10 мая 2019

Я написал небольшой и безусловно улучшаемый php-скрипт, который служит именно для этой цели.Он использует заданные учетные данные (пользовательский адрес электронной почты и ключ API) для подключения к API Cloudflare.Чтобы получить ключ API:

  1. Войдите в учетную запись Cloudflare.

  2. Перейдите на Мой профиль .

  3. Прокрутите вниз до Ключи API и найдите Глобальный ключ API .

  4. Нажмите API Key , чтобы увидеть ваш идентификатор API.

На первом шаге скрипт запрашивает так называемый Zone-ID, который является уникальнымидентификатор домена, который вы хотите контролировать.Поскольку Cloudflare на сегодняшний день не дает возможности просматривать этот идентификатор в своем бэкэнде, его можно получить только через запрос API.

На втором шаге мы снова подключаемся к API Cloudflare, на этот раз инструктируя очистить весь кэш дляэта зона.

Вот мое решение (я положил его в конец моего плагина обновления-скрипта для запуска после того, как все остальное закончится):

<?php

    //Credentials for Cloudflare
    $cust_email = ''; //user@domain.tld
    $cust_xauth = ''; //retrieved from the backend after loggin in
    $cust_domain = ''; //domain.tld, the domain you want to control

    if($cust_email=""||$cust_xauth=""||$cust_domain="") return;

    //Get the Zone-ID from Cloudflare since they don't provide that in the Backend
    $ch_query = curl_init();
    curl_setopt($ch_query, CURLOPT_URL, "https://api.cloudflare.com/client/v4/zones?name=".$cust_domain."&status=active&page=1&per_page=5&order=status&direction=desc&match=all");
    curl_setopt($ch_query, CURLOPT_RETURNTRANSFER, 1);
    $qheaders = array(
        'X-Auth-Email: '.$cust_email.'',
        'X-Auth-Key: '.$cust_xauth.'',
        'Content-Type: application/json'
    );
    curl_setopt($ch_query, CURLOPT_HTTPHEADER, $qheaders);
    $qresult = json_decode(curl_exec($ch_query),true);
    curl_close($ch_query);

    $cust_zone = $qresult['result'][0]['id']; 

    //Purge the entire cache via API
    $ch_purge = curl_init();
    curl_setopt($ch_purge, CURLOPT_URL, "https://api.cloudflare.com/client/v4/zones/".$cust_zone."/purge_cache");
    curl_setopt($ch_purge, CURLOPT_CUSTOMREQUEST, "DELETE");
    curl_setopt($ch_purge, CURLOPT_RETURNTRANSFER, 1);
    $headers = [
        'X-Auth-Email: '.$cust_email,
        'X-Auth-Key: '.$cust_xauth,
        'Content-Type: application/json'
    ];
    $data = json_encode(array("purge_everything" => true));
    curl_setopt($ch_purge, CURLOPT_POST, true);
    curl_setopt($ch_purge, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch_purge, CURLOPT_HTTPHEADER, $headers);

    $result = json_decode(curl_exec($ch_purge),true);
    curl_close($ch_purge);

    //Tell the user if it worked
    if($result['success']==1) echo "Cloudflare Cache successfully purged! Changes should be visible right away.<br>If not try clearing your Browser Cache by pressing \"Ctrl+F5\"";
    else echo "Error purging Cloudflare Cache. Please log into Cloudflare and purge manually!";

?>
...