在使用 易優CMS(Youzhicms) 搭配 CDN 加速服務 時,如果遇到 文章閱讀量(點擊數)不增加或不變 的問題,這通常是由于 CDN 緩存機制將整個頁面(包括動態的閱讀統計接口)也緩存了,導致每次訪問都返回緩存內容,而沒有真正執行“閱讀+1”的 php 動作。以下是系統解決方案:
<!-- 在文章詳情模板添加時間戳參數 -->
<script src="{:url('API/Article/views', ['id'=>$arcid, 't'=>time()])}"></script>
<!-- 或使用隨機數 -->
<script>
var random = Math.random() * 10000;
var url = "{:url('api/Article/views', ['id'=>$arcid])}&r=" + random;
document.write('<script src="' + url + '"><\/script>');
</script><!-- 設置不緩存閱讀量相關文件/URL --> 緩存規則: 1. 文件類型:不緩存 .php 動態文件 2. 目錄規則:不緩存 /api/ 目錄 3. URL參數:忽略特定參數(如 view、click) 具體設置: 位置:CDN控制臺 → 域名管理 → 緩存配置 規則:/api/*.php?* → 緩存時間 0秒 規則:/news/*.Html?view=* → 緩存時間 0秒
1. 目錄刷新規則: - 文件類型:.php - 緩存時間:0秒 2. 節點緩存規則: - 添加規則:/api/article/views* - 緩存行為:不緩存
// 在文章頁面底部添加
<script>
$(function(){
// 方法1:直接AJAX請求
$.ajax({
url: '/api/article/views',
type: 'POST',
data: {id: {$arcid}},
dataType: 'json',
success: function(res){
console.log('閱讀量已更新');
}
});
// 方法2:圖片方式(兼容性最好)
var img = new Image();
img.src = '/api/article/views?id={$arcid}&t=' + new Date().getTime();
});
</script>
// 文件位置:application/common/model/Article.php
// 修改 getViews 方法或新增獨立方法
public function updateViews($id){
// 使用Redis或Memcached減少數據庫壓力
$key = 'article_views_' . $id;
// 方案A:使用Redis計數
if(cache($key)){
cache($key, cache($key) + 1, 3600);
} else {
$views = $this->where('arcid', $id)->value('click');
cache($key, $views + 1, 3600);
}
// 定時寫入數據庫(如每10次更新一次)
if(cache($key) % 10 == 0){
$this->where('arcid', $id)->inc('click', 10)->update();
}
}// 創建 application/api/controller/Article.php
public function views(){
$id = input('id/d', 0);
if($id){
// 防刷機制
$ip = request()->ip();
$cacheKey = 'view_ip_' . md5($ip . '_' . $id);
if(!cache($cacheKey)){
Db::name('archives')->where('arcid', $id)->inc('click')->update();
cache($cacheKey, 1, 300); // 5分鐘內不重復計數
}
return json(['code'=>1, 'msg'=>'success']);
}
}# 在Nginx配置中添加
location ~* \.php$ {
# 添加緩存頭控制
add_header Cache-Control "private, no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
# 針對閱讀量接口特殊處理
if ($request_uri ~* "/api/article/views") {
expires -1;
add_header Cache-Control "no-cache";
}
}
# 設置CDN緩存規則
location ~* \.(html|htm)$ {
# 帶參數的頁面不緩存
if ($args ~* "view=|update=") {
set $no_cache 1;
}
expires 1h;
add_header Cache-Control "public";
}# 防止CDN緩存閱讀量相關URL <IfModule mod_headers.c> # 閱讀量接口不緩存 <FilesMatch "(views|click|update)" > Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </FilesMatch> # 靜態頁面緩存 <FilesMatch "\.(html|htm)$"> Header set Cache-Control "max-age=3600, public" </FilesMatch> </IfModule>
1. 控制臺 → CDN → 域名管理 → 緩存配置 2. 添加緩存規則: - 規則類型:目錄 - 規則內容:/api/ - 緩存時間:0 - 優先級:最高 3. 添加文件類型規則: - 規則類型:文件后綴名 - 規則內容:php - 緩存時間:0
1. 控制臺 → CDN → 域名管理 → 緩存配置 2. 節點緩存過期配置: - 文件類型:.php - 不緩存 3. 目錄刷新: - 刷新路徑:/api/* - 刷新類型:刷新變更資源
1. 服務 → 功能配置 → 緩存控制 2. 設置不緩存規則: - 路徑:^/api/ - 行為:不緩存 3. 設置邊緣規則: - 匹配:$URI ~ "\.php" - 設置header:Cache-Control: no-cache
// 頁面加載完成后才發送閱讀量請求
window.addEventListener('load', function(){
setTimeout(function(){
var script = document.createElement('script');
script.src = '/api/article/views?id={$arcid}&_' + Date.now();
document.body.appendChild(script);
}, 3000); // 延遲3秒,確保頁面被看到
});// 定時任務批量更新閱讀量
// 創建定時任務文件 application/cron/UpdateArticleViews.php
class UpdateArticleViews {
public function run(){
$redis = \think\facade\Cache::store('redis');
$keys = $redis->keys('article_views_*');
foreach($keys as $key){
$id = str_replace('article_views_', '', $key);
$views = $redis->get($key);
if($views > 0){
Db::name('archives')->where('arcid', $id)
->inc('click', $views)
->update();
$redis->set($key, 0); // 重置為0
}
}
}
}
// 配置定時任務每10分鐘執行一次清理CDN緩存
# 刷新CDN緩存 curl -X POST "https://cdn.aliyuncs.com/?Action=RefreshObjectCaches" \ -d "ObjectPath=你的域名/api/*" \ -d "ObjectType=Directory"
測試閱讀量更新
// 控制臺測試
fetch('/api/article/views?id=文章ID')
.then(res => console.log(res))
.catch(err => console.error(err));檢查緩存頭
curl -I "https://你的域名/news/1.html" # 檢查Cache-Control、X-Cache等頭部
分離計數與內容
閱讀量通過獨立API更新
頁面內容可被CDN緩存
設置合理的緩存策略
首頁:緩存1小時 列表頁:緩存30分鐘 詳情頁:緩存10分鐘 動態接口:不緩存
監控與報警
監控閱讀量增長異常
設置CDN命中率報警
定期檢查緩存規則
備用方案
準備無CDN的閱讀量接口
實現客戶端本地計數+定時同步
使用第三方統計工具(如CNZZ)作為補充
[ ] CDN配置是否生效(檢查響應頭)
[ ] 閱讀量接口是否可正常訪問
[ ] 是否有防刷機制干擾
[ ] 數據庫更新權限是否正常
[ ] 服務器時間是否同步
[ ] 防火墻是否攔截API請求
通過上述方案,可徹底解決CDN緩存導致的閱讀量不更新問題。推薦使用方案3(AJAX異步更新) 配合CDN緩存規則配置,實現最優效果。
標簽:
本文鏈接:http://www.373753.com/xinwendongtai/2118.html
版權聲明:站內所有文章皆來自網絡轉載,只供模板演示使用,并無任何其它意義!
下一篇: 易優站內搜索特殊字符報錯如何解決