標簽歸檔:WordPress

巧用404.php解決WordPress耗資源的問題,給WordPress加個緩存功能

剛開始搭建博客的時候,看中了wordpress的功能強大,經過兩年的不懈努力,我的小博已經從pr0到pr4(最近降到pr3),有的時候每日pv竟然能到3萬,這時idc那邊就提醒我好資源了。自己購買了臺西數的VPS,配置好后,cpu也是居高不下,首頁竟然要4秒鐘才能打開。當時考慮到seo,路徑使用了http://www.shiekolong331.icu/p/wordpress-plus-chc(注意,不是文件夾)的模式,生成靜態,路徑就變了http://www.shiekolong331.icu/p/wordpress-plus-chc/。第一,我不想耗資源,第二,我不想改變路徑。
我博客的現在的路徑是怎樣實現的呢?這個問題請看我以前的一篇文章WordPress無Rewrite用cos-html-cache實現靜態化(http://www.shiekolong331.icu/p/wordpress-plus-chc)。既然一切皆由404.php起,那么現在就從404.php找切入點,比如在404.php上加個緩存。聲明:本文由苗啟源發表在他的博客,一切思想皆為苗啟源原創,轉帖請注明出處。
這個換成怎樣加呢?改動源程序也不現實,而且文件太多,太麻煩。這時我想到了前幾天寫的一篇文章Python 之 XML與文本操作(http://www.shiekolong331.icu/p/python-xml-file),在那篇文章中,也是使用了緩存,比如請求http://www.shiekolong331.icu/products/,因為沒有用到數據庫,把請求過的網址記錄到一個文本文件,少了還好說,多了就。。。最好的辦吧就是把每個URL地址返回的內容保存到MD5(URL)的文件中,如果讀取的時候該文件存在,說明已經讀取過了,有緩存。python源碼請見Python 之 XML與文本操作(http://www.shiekolong331.icu/p/python-xml-file)。
這樣就好辦了,直接按以前說的那種方法。404.php返回的請求路徑,我沒給md5下,如果存在,就直接讀取,不存在,執行程序,然后保存到緩存文件中。下面給出404.php的代碼,如果覺得本文對您有所幫助,請Ctrl+D收藏我的博客地址,我最近準備寫一個php的緩存類哦。

< ?php
$qs = $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_URI'] = substr($qs, strpos($qs, ':80')+3);
$CacheStr = md5($_SERVER['REQUEST_URI']);

if(!$fp=@fopen("./404cache/".$CacheStr.".tmp","r")){
	$getHtml=file_get_contents("http://www.shiekolong331.icu/index.php".$_SERVER['REQUEST_URI']);
	$fp=fopen("./404cache/".$CacheStr.".tmp","w");
	fwrite($fp,$getHtml);
	echo $getHtml;
}
echo fread($fp,1100000);
?>

基本功能都實現了。不過更新是個問題,還有緩存數據,我會分別用Mysql數據庫,XML文件,文本文件分別存取,關于速率我還要進一步進行測試。文本文件的存儲緩存的一個致命的缺點就是最后更新時間,緩存的有效時間不好控制。如果用xml或數據庫,這個問題就簡單了。好了,現在時間太晚了,就此結筆(鍵盤)。

WordPress無Rewrite用cos-html-cache實現靜態化

WordPress是一個非常不錯的博客程序(不然本人頁不用啊~),但是有一個缺點~插件安裝多了就顯示的很慢,但是還有很多插件不得不裝,比如本人是個程序員,在網站上發布自己的心得,前幾天寫了域名批量查詢工具by苗啟源:http://miaoqiyuan.cn/p/yuming-query/,想要吧代碼高亮的形式顯示,安裝了WP-Syntax:http://wordpress.org/extend/plugins/wp-syntax/,這樣每次有用戶請求頁面就很變的很慢,甚至導致用戶不能正常訪問。這時候實現程序的靜態化是一個不錯的選擇~

在網上狂搜一番,口碑最好的是cos-html-cache(http://wordpress.org/extend/plugins/cos-html-cache/),其最新版本為2.5,需要服務器支持Rewrite才能實現,但是國內虛擬主機基本上都是Window主機IIS平臺,很少有支持Rewrite(IIS需要ISAPI Rewrite支持),難道國內的WrodPress只能用Liunx虛擬主機才能實現嗎?我們Windows主機就沒有靜態化的權利?

經過筆者一番測試,終于實現了用WordPress不使用Rewrite實現靜態化的方法(http://miaoqiyuan.cn/p/wordpress-plus-chc)

1.下載cos-html-cache 1.1(http://downloads.wordpress.org/plugin/cos-html-cache.1.1.zip),解壓,傳到/wp-content/plugins/目錄,在后臺”插件”中啟用”cos-html-cache”

2.在”設置”永久選項中,自定義結構修改靜態化的規則,本站為/p/%postname%/

3.在”設置”-“CosHtmlCache” 生成靜態??吹竭@里,可能有的讀者會說這和網上的很多文章一樣,不就是網上的文章Copy了一份嗎?這樣是實現了內容頁的靜態化,點分類的時候就開始提示出錯了~因為CosHtmlCache1.1只支持文章頁首頁的靜態化,沒有這個頁面自然不能訪問咯。解決方法嘛,請往下看:

4.現在虛擬主機都支持404頁面自定義,所以~~聰明的你想到了吧?如果訪問已經生成的靜態頁,自然能正常訪問,不能生成的呢?提交參數給index.php,這樣就實現了服務器不支持Rewrite實現靜態化的目的了,下面是功能實現的代碼:

我的空間支持404.asp,所以先發個404.asp的代碼

&lt; %
'ASP_Rewrite with 404 By MiaoQiyuan
 
'定義WordPress的處理頁面,也可以是"/?"
PHP_Resource="/index.php/"
 
'獲取服務器地址,這樣可以實現多域名訪問
Hst_Svr=Request.Servervariables("HTTP_HOST")
'獲取服務器端口,防止
Hst_Pot=Request.Servervariables("SERVER_PORT")
'構造網址
Hst=Hst_Svr&amp;":"&amp;Hst_Pot
'構成404錯誤提交給404.asp的請求,因為服務器不一樣,大家可以自己根據自己的虛擬主機測試一下
Err_404="404;http://"&amp;Hst&amp;"/"
Res_Get=Request.QueryString
'用真實404.asp的請求的錯誤信息(包括錯誤的請求地址)替換掉構成404錯誤,就剩下了請求的相對地址
Fnk_Get=Replace(Res_Get,Err_404,"")
 
'如果不為空,吧Fnk_Get提交給定義WordPress的處理頁面
If Request.QueryString&lt;&gt;"" then
	Response.Redirect PHP_Resource&amp;Fnk_Get
Else
	Response.Redirect PHP_Resource&amp;"404.php"
End if
%&gt;

下面說一下普通404.htm實現上述功能,因為html不能直接獲取端口域名,所以我們用JS調用的方法,404.htm頁面的代碼只有一行

<script src="404_js.asp" type="text/javascript"><!--mce:0--></script>

404_js.asp的代碼如下

&lt; %
&lt;%
'ASP_Rewrite with 404,Javascript By MiaoQiyuan
 
'定義WordPress的處理頁面,也可以是"/?"
PHP_Resource="/index.php/"
 
'獲取服務器地址,這樣可以實現多域名訪問
Hst_Svr=Request.Servervariables("HTTP_HOST")
'獲取服務器端口,防止
Hst_Pot=Request.Servervariables("SERVER_PORT")
'構造網址
Hst=Hst_Svr&amp;":"&amp;Hst_Pot
'構成404錯誤提交給404.asp的請求
Err_404="404;http://"&amp;Hst&amp;"/"
%&gt;
<!--
var _Err;
if(location.search){
	_Err=location.search.replace("?<%=Err_404%>","");
}
else{
	_Err=location.href.replace("http://< %=Hst%>/","");
	_Err=location.href.replace("http://< %=Hst_Svr%>/","");
}
 
location.href="< %=PHP_Resource%>"+_Err;
-->

為什么不是用CosHtmlCache2.5?
因為CosHtmlCache2.0以上的版本都是根據Rewrite第一次訪問自動生成,比如這篇文章,/p/wordpress-plus-chc,第一次訪問,因為沒有頁面跳到/index.php/p/wordpress-plus-chc,這樣文件路徑就是/index.php/p/wordpress-plus-chc,而不是/p/wordpress-plus-chc,所以導致不能生成,而CosHtmlCache1.1是在文章創建的時候根據設置中的路徑生成。

如果服務器僅支持404.htm是否有生成的必要?
在不考慮搜索引擎收錄的情況下,可以使用,如果想要搜索引擎較好的收錄,建議不要使用。404.htm只能通過JavaScript在瀏覽器中識別,而在搜索引擎中只能看到<script type=”text/javascript” src=”404_js.asp”></script>,如果支持404.asp就能較好的收錄