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