当前我的博客基于wordpress搭建,使用了W3 Total cache静态化插件和阿里云DCDN(其实只使用了静态资源加速,关闭动态资源加速后就相当于CDN,但API接口不同)。W3和CDN搭配能够极大提高网站访问速度,但有个问题是W3自带的CDN模块没有内置国内云服务器的接口,这样就无法在W3设置CDN的刷新。每当有文章更新,新评论、新回复时,W3会自动刷新相关页及首页,但CDN还是旧文件,这就导致评论显示不及时等问题。要解决这个问题,我以前采用的是W3缓存设置很长的页面缓存时间,但CDN设置10分钟缓存,这样取中值5分钟页面怎么也会更新。但这种设置导致一个问题,就是CDN需要经常回源,这比直接从服务器访问html更慢。
于是我就想找一款能够自动刷新阿里云DCDN/CDN缓存的插件,来配合W3使用,但未果。于是开始尝试借助阿里的人工智能通义千问来设计一款能够实现以上需求的插件,原本是想设计一款能够自动刷新的插件,但一直没有成功,最终测试成功了现在这款纯手动的插件Aliyun DCDN Cache Flush。我自己不懂任何编程技术,插件的编制完全是在自然语言交互下由通义千问完成的,我负责的只是提要求和测试,连软件名称都是人工智能提供的。
好在我的博客访问量不大,交互式内容较少,很多页面只有刚发布时需要更新,此后一直保持静态即可,因此尽管是手动刷新,但已经能满足我的使用。现在我W3的html缓存设置为1年,CDN的缓存设置为1个月,大多数页面请求都能直接从CDN应答,访问速度快不少。
过程中的经验
一、阿里云CDN的远程管理方法
1、借助于阿里云SDK库
这种方法需要在服务器安装库,比较麻烦。如果不安装库,则需要把依赖的SDK文件下载下来放入插件文件夹,需要下载的依赖文件有十几个,太臃肿,所以放弃了。
2、借助于阿里云CLI接口
这种方案下只需要在服务器部署阿里云的CLI服务,不需要SDK库,但人工智能给的插件一直测试不成功,于是页放弃了。
3、借助于阿里云API接口(现在采用)
这种方法不需要安装依赖库,不需要配置服务器环境,简单方便。
二、连接阿里云API接口的方法
1、借助于php函数
需要的函数基本上都是exec、shell-exec这种高危函数,对于不懂服务器管理的人来说这比较危险,所以放弃。
2、借助于php的cURL扩展(采用的方案)
这种方法仅需要php的cURL扩展来连接阿里云的API接口(绝大多数服务器程序已内置),不需要任何php函数,安全可靠。
插件介绍
Aliyun DCDN Cache Flush插件是仅包含一个162行代码的php文件,还有一个txt说明文档(可以删除),插件总共大约8K大小。
说明文档的内容如下:
1、本插件仅需要服务器支持cURL扩展,利用阿里云DCDN的API刷新缓存,请确认你的服务器支持cURL扩展,当前新版本的服务器基本上都支持。本插件避免使用exec、shell-exec 或其他类似的高危函数,降低被攻击危险。
2、使用前请打开插件里面唯一的php文件,替换 <Your-Access-Key-Id> 和 <Your-Access-Key-Secret> 为你自己的阿里云访问密钥。
3、测试时在Ajax评论下能正常运行,如不正常请关闭Ajax评论。
4、本插件只具备手动刷新功能,后台常开即可,占用资源很少。
上面是插件的使用界面,只需要输入阿里云DCDN的域名,可以自动记忆。然后每次使用时输入要刷新的页面链接即可。
下面是插件主体Aliyun DCDN Cache Flush.php的内容,贴出来需要的同学可以参考,也可直接复制保存成UTF-8使用。贴出来的目的一是供探讨;二是很多人可能认为下载的插件不安全,贴出代码大家踏实点。
<?php /* Plugin Name: Aliyun DCDN Cache Flush Description: 本插件可以手动刷新阿里云全站加速DCDN的缓存(CDN未测试).本插件仅依赖于php的cURL扩展,请确保服务器支持.请先打开插件里的php文件替换 Your-Access-Key-Id 和 Your-Access-Key-Secret 为你自己的阿里云访问密钥。. Version: 1.0 Author URI: http://www.savouer.com/ Author: 水拍石 */ if (!defined('ABSPATH')) { exit; // Exit if accessed directly } // Add the settings page for the plugin add_action('admin_menu', 'ac_add_admin_menu'); function ac_add_admin_menu() { add_menu_page( 'Aliyun DCDN Cache Flush', // Page title 'Aliyun DCDN', // Menu title 'manage_options', // Capability 'aliyun_dcdn_cache_flush', // Menu slug 'ac_settings_page' // Function ); } // Render the settings page function ac_settings_page() { // Retrieve the saved DCDN domain $dcdn_domain = get_option('ac_dcdn_domain', ''); ?> <div class="wrap"> <h1>Flush Aliyun DCDN Cache</h1> <form method="post" action="<?php echo admin_url('admin-post.php'); ?>"> <input type="hidden" name="action" value="ac_flush_dcdn"/> <?php wp_nonce_field('ac_flush_dcdn_nonce', 'ac_flush_dcdn_nonce_field'); ?> <table class="form-table"> <tr valign="top"> <th scope="row">DCDN域名</th> <td> <input type="text" name="ac_dcdn_domain" value="<?php echo esc_attr($dcdn_domain); ?>" size="50" required/> <p class="description">请输入你想刷新的阿里云DCDN域名,非CNAME.</p> </td> </tr> <tr valign="top"> <th scope="row">要刷新的链接</th> <td> <textarea name="ac_urls_to_flush" rows="10" cols="50" required></textarea> <p class="description">输入你想刷新的url,每行一个.</p> </td> </tr> </table> <?php submit_button(); ?> </form> </div> <?php if (isset($_GET['flushed']) && $_GET['flushed'] == 'true') { echo '<div id="message" class="updated"><p>这些链接刷新成功.</p></div>'; } elseif (isset($_GET['error'])) { echo '<div id="message" class="error"><p>一个或多个链接刷新失败,请检查链接重试.</p></div>'; } } // Handle the form submission add_action('admin_post_ac_flush_dcdn', 'ac_handle_flush_dcdn'); function ac_handle_flush_dcdn() { // Check nonce for security if (!isset($_POST['ac_flush_dcdn_nonce_field']) || !wp_verify_nonce($_POST['ac_flush_dcdn_nonce_field'], 'ac_flush_dcdn_nonce')) { die('Security check failed.'); } if (isset($_POST['ac_dcdn_domain']) && isset($_POST['ac_urls_to_flush'])) { $dcdn_domain = sanitize_text_field($_POST['ac_dcdn_domain']); update_option('ac_dcdn_domain', $dcdn_domain); // Save the DCDN domain $urls = explode("\n", trim($_POST['ac_urls_to_flush'])); $all_success = true; foreach ($urls as $url) { $url = sanitize_text_field($url); if (empty($url)) continue; // Call the Aliyun API using cURL $ch = curl_init(); $accessKeyId = 'Your-Access-Key-Id'; // 替换为你的正确的Access Key ID $accessKeySecret = 'Your-Access-Key-Secret'; // 替换为你的正确的Access Key Secret $timestamp = gmdate("Y-m-d\TH:i:s\Z"); $signatureNonce = uniqid(mt_rand(), true); // Prepare the parameters $params = [ 'Action' => 'RefreshDcdnObjectCaches', 'DomainName' => $dcdn_domain, 'ObjectPath' => $url, 'ObjectType' => 'File', 'Format' => 'JSON', 'Version' => '2018-01-15', 'AccessKeyId' => $accessKeyId, 'SignatureMethod' => 'HMAC-SHA1', 'Timestamp' => $timestamp, 'SignatureNonce' => $signatureNonce, 'SignatureVersion' => '1.0', ]; // Sort the parameters ksort($params); // Generate the string to sign $stringToSign = "GET&%2F&" . urlencode(http_build_query($params, '', '&', PHP_QUERY_RFC3986)); // Generate the signature $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true)); // Construct the API URL $apiUrl = "https://dcdn.aliyuncs.com/?" . http_build_query($params, '', '&', PHP_QUERY_RFC3986) . "&Signature=" . urlencode($signature); // Log the request URL for debugging error_log("API Request URL: " . $apiUrl); curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Log the response for debugging error_log("API Response: " . print_r($response, true)); // Check the HTTP status code and parse the JSON response if ($httpCode != 200) { $all_success = false; error_log("HTTP Error: " . $httpCode); break; } else { $responseData = json_decode($response, true); if (isset($responseData['Code']) && $responseData['Code'] == 'Success') { // Success error_log("API Call Successful for URL: " . $url); } elseif (isset($responseData['RefreshTaskId'])) { // Task accepted error_log("API Call Successful for URL: " . $url); error_log("Refresh Task ID: " . $responseData['RefreshTaskId']); } else { // Failure $all_success = false; error_log("API Call Failed for URL: " . $url); error_log("Response Data: " . print_r($responseData, true)); break; } } curl_close($ch); } // Redirect with success or error message if ($all_success) { wp_redirect(add_query_arg(array('flushed' => 'true'), admin_url('admin.php?page=aliyun_dcdn_cache_flush'))); } else { wp_redirect(add_query_arg(array('error' => 'true'), admin_url('admin.php?page=aliyun_dcdn_cache_flush'))); } exit; } }
声明
1、因为我不懂代码,以上代码完全由通义千问输出,所以难免有漏洞或BUG,如果有也不是我刻意的,请自行分析风险。
2、如插件真有漏洞,请不要用我的站做攻击测试,小站维护不易,一攻就倒。
如发现漏洞,能修复并告知我,则甚为感激。
3、对未知风险的插件做分享,仅是为了方便和我有相同需求的人,不要做任何恶意的动机揣摩。
4、以上插件可以任意修改、传播、分享;但不能用于基于此插件的任何售卖形式的盈利活动,及不能将此插件用于非法活动。
5、对于此插件本人不收取任何费用,不接受打赏。
6、不要就此插件功能及代码和我进行技术性讨论,因为我压根就不懂。
致谢
在此致谢,百问不烦、全知全能的通义千问;在我博客维护及优化中给予我帮助的博友老麦、雅余、天一生水等。
插件下载
以上插件如不想自己复制代码建立,可直接下载使用。
本站文章授权后方可转载,请勿侵权! 如喜欢可点击分享按钮分享。
6F
哈哈,真是人才,还可以这样干
B1
@ maie 不会自动的就玩手动,等大佬们开发自动插件。
5F
哈哈,有问题直接交给AI就行,我用AI写代码不多,下次也来试试,之前只用ChatGPT尝试写过一点代码,能用。通义千问之前只用来生成图片。
B1
@ 威言威语 国产AI也比较好用了,阿里家的我感觉还不错,豆包原来感觉也不错,但最近老推荐抖音视频,所以不用了。
4F
缓存插件是必须的,CDN我没有上,但被刷!
B1
@ 老张博客 被刷没办法,总有闲人损人不利己。
3F
开cdn有是一笔不小的费用,我的破站就不搞动静分离了。
B1
@ MrHe 一年就几十块钱,比服务器性价比高多了。
2F
换主题了嘛?新的主题PC界面很紧凑,赞一个!
B1
@ 紫慕 还是原来的主题,只是干掉了侧边栏,换了背景色。
1F
这几天的更新频率很可以,多来些,我也有WP站,后面抄作业
B1
@ XIGE 搞不动了,这几天花的时间太多,再说也没有其他急迫的需求了,后面专心写就行。