今天有個(gè)馬來西亞vps客戶搭建了個(gè)自己用的博客,之前他這個(gè)馬來西亞vps還是比較穩(wěn)定的但是瀏覽量不見漲,這個(gè)就很尷尬了,
突然發(fā)現(xiàn)文章瀏覽計(jì)數(shù)功能失效了,文章發(fā)了幾個(gè)月才幾十上百的瀏覽數(shù),本以為是因?yàn)樽罱l(fā)的文章都比較冷門,不受歡迎。但是發(fā)布了幾個(gè)月,才不到2百的訪問量,這就不合理了。
一、發(fā)現(xiàn)問題
于是花時(shí)間分析了下,結(jié)果一查網(wǎng)站日志,發(fā)現(xiàn)瀏覽計(jì)數(shù)的請求居然一個(gè)都沒有。。。
由于網(wǎng)站開啟了純靜態(tài)緩存(nginx_fastcgi_cache),所以wp-postviews的計(jì)數(shù)方式會(huì)自動(dòng)改為ajax提交方式,正常情況下,Nginx日志里面會(huì)出現(xiàn)如下請求記錄:
/wp-admin/admin-ajax.php?postviews_id=xxxx&action=postviews&_=xxxxxxxxxx |
而我翻看了最近半個(gè)月的Nginx日志,只有寥寥數(shù)條,看來確實(shí)有情況。
二、解決問題
首先,我打開了一篇文章,按下F12,再刷新該頁面,在NetWork內(nèi)容中搜索我熟悉的admin-ajax,發(fā)現(xiàn)沒有記錄,甚至搜索php關(guān)鍵詞都沒有任何請求記錄,直接在頁面源碼中搜索關(guān)鍵詞也是一無所獲,看來確實(shí)沒有瀏覽計(jì)數(shù)代碼了。
我以為是更新了WP導(dǎo)致PostViews插件不工作了,于是打開WP-PostViews源碼看了下,發(fā)現(xiàn)有如下邏輯代碼:
if($should_count) { |
if(defined('WP_CACHE') && WP_CACHE) { |
echo "\n".'<!-- Start Of Script Generated By WP-PostViews -->'."\n"; |
echo '<script type="text/javascript">'."\n"; |
echo '/* <![CDATA[ */'."\n"; |
echo "jQuery.ajax({type:'GET',url:'".admin_url('admin-ajax.php')."',data:'postviews_id=".$id."&action=postviews',cache:false});"; |
echo '/* ]]> */'."\n"; |
echo '</script>'."\n"; |
echo '<!-- End Of Script Generated By WP-PostViews -->'."\n"; |
} else { |
if(!update_post_meta($id, 'views', ($post_views+1))) { |
add_post_meta($id, 'views', 1, true); |
} |
} |
} |
發(fā)現(xiàn)了開啟ajax計(jì)數(shù)的必要條件:開啟WP_CACHE緩存。。。!
鑒于對WP的熟悉程度,我直接打開了wp-config.php文件,發(fā)現(xiàn)果然是我自己注釋了如下代碼:
//define("WP_CACHE", true); |
估計(jì)是之前調(diào)試網(wǎng)站的時(shí)候注釋掉了。
于是取消注釋,重載php-fpm,并清理Nginx靜態(tài)緩存后,前臺(tái)熟悉的ajax代碼就回來了:
<!-- Start Of Script Generated By WP-PostViews --> |
<script type="text/javascript"> |
/* <![CDATA[ */ |
jQuery.ajax({ |
type:'GET', |
url:'https://zhang.ge/wp-admin/admin-ajax.php', |
data:'postviews_id=5832&action=postviews', |
cache:false |
}); |
/* ]]> */ |
</script> |
<!-- End Of Script Generated By WP-PostViews --> |
再看了下Nginx日志,admin-ajax.php?xxx的請求也回來了,看來瀏覽計(jì)數(shù)功能已恢復(fù)正常。
三、結(jié)論分析
①、為什么并非完全不計(jì)數(shù)或只計(jì)數(shù)一次?
回溯了下過程,很明顯的發(fā)現(xiàn),文章發(fā)布后還是有計(jì)數(shù)的,只是計(jì)數(shù)非常少,這是為什么?實(shí)際上,原因非常簡單,文章在首次緩存的時(shí)候,WP-PostViews其實(shí)是會(huì)工作一次的,使用的是非緩存環(huán)境下的php計(jì)數(shù)。計(jì)數(shù)之后,文章就緩存下來了,再次訪問就不會(huì)再更新計(jì)數(shù)了,直到有人發(fā)表了評論或者緩存到期,導(dǎo)致緩存被刷新,才會(huì)再一次發(fā)起瀏覽計(jì)數(shù)!這就是為啥并非不計(jì)數(shù)或只計(jì)數(shù)一次的原因了。
②、WP-PostViews緩存環(huán)境下計(jì)數(shù)的條件
這個(gè)問題很常見,剛我還搜了下,發(fā)現(xiàn)也有不少和我這個(gè)類似的情況。也就說,PostViews插件會(huì)去判斷WP是否開啟了緩存(WP_CACHE),若開啟了則使用ajax的計(jì)數(shù)方式,否則使用php計(jì)數(shù)方式。
因此,如果你使用的是非PHP的緩存機(jī)制,比如Nginx的fastcgi_cache或者proxy_cahe,那么必須在wp-config.php里面開啟WP_CACHE:
define("WP_CACHE", true); |
讓插件知道你的網(wǎng)站是有緩存機(jī)制的。要不然,你就得修改插件,去掉這個(gè)判斷,讓插件強(qiáng)行在頁面中插入ajax計(jì)數(shù)代碼了。