通过PHP中的API清除Cloudflare缓存

时间:2019-05-10 09:54:18

标签: php json wordpress caching cloudflare

我在一个朋友的网站上遇到了这个问题。这是一个带有多个插件的Wordpress安装。这些插件之一用于更新多个图像(从远程位置收集它们并将其存储在本地以节省带宽)。但是,在运行该插件时,该网站似乎拒绝显示更新的图像,并不断向我提供服务器上不再存在的旧版本。

浏览器高速缓存被迅速排除为原因。 Wordpress可能有点棘手,所以我检查了所有其他插件,插件以及是否有任何形式的对象缓存处于活动状态。在也排除了这一点之后,我想到托管服务提供商一定是问题所在。我不知道,不得不发现他们使用Cloudflare作为DNS提供程序来为其网站获得有效的SSL证书。但是,默认情况下,Cloudflare也带有缓存,这可能非常激进。

由于他们喜欢缓存并希望保持其开启状态,所以我告诉我的朋友在Cloudflare手动清除缓存。塔达(Ta-Da)-更新后的图像按原样显示。

因此,为了避免每次调用该插件时都登录Cloudflare的过程,我正在寻找一种使用其API的方法来方便地解决此问题。我需要一些php代码(以集成到Wordpress-Plugin中)...

1 个答案:

答案 0 :(得分:1)

我写了一个很小的,肯定可以改进的php脚本,正是出于这个目的。它使用给定的凭据(用户电子邮件和API密钥)连接到Cloudflare的API。要检索API密钥:

  1. 登录到Cloudflare帐户。

  2. 转到我的个人资料

  3. 向下滚动到API密钥,然后找到 全局API密钥

  4. 单击“ API密钥” 以查看您的API标识符。

第一步,脚本查询所谓的Zone-ID,这是您要控制的域的唯一标识符。到目前为止,由于Cloudflare没有提供在后端查看此ID的选项,因此只能通过API请求获得。

在第二步中,我们再次连接到Cloudflare的API,这一次指示清除该区域的整个缓存。

这是我的解决方案(我将其放在插件updater-script的底部,以便在其他所有操作完成后运行):

<?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!";

?>