很多人採用WordPRess來做圖片型的網站,在頁面上通常需要載入很多上傳的附件圖片。雖然wordpress的空間可以指定附件為一個絕對的URL位址,但遠遠不夠解決瀏覽器下載的執行緒機制的限制。以下是我針對wordpress的解決方法。
在說辦法之前,先來了解下瀏覽器的下載線程是什麼。簡單點來說,就是你在用瀏覽器打開一個網頁頁面時,若這個頁面上所有圖片、樣式、js等放在同一個網域之下,那麼瀏覽器向伺服器請求時就必須請求一個下載完再請求下一個(或可以同請求幾個下載完再繼續請求,不同瀏覽器有所不同)。若這個頁面下的圖片、樣式、js等這些檔案都放一個網域並過多的話,開啟網頁頁面時等待的佇列也就長。 (如你2M的寬頻對比4M的寬頻是快不了多少的)
解決的想法就是同時下載更多數據,限於同域名下的限制問題,我們可以採用多域名的方式來解決。
若你的空間允許綁定多個子目錄,那麼可以設多個子網域綁定到wordpress的附件wp-content/uploads/下。
我的是把我的子網域http://pic0.tsov.net/和http://pic1.tsov.net/綁定到wp-content/uploads/下的。
同時在後台的“設定”,“媒體”中指定你設定的子網域(若你部落格已有數據,可用phpmyadmin執行語句,一次性把附件轉換過來),
例如我的設定為:(檔案的完整URL 位址: http://pic.tsov.net )
接著在你主題下的functions.php檔案中加入下面程式碼。
<?php
function setting_pic_tsov_net($content) {
$pattern="/<img**************/"; (因此處無法顯示完整程式碼,請點選下載完整的程式碼)
preg_match_all($pattern,$content,$match);
$iNumberOfPics = count($match[0]);
for ( $i=0; $i < $iNumberOfPics ; $i++ ){
$tsovnet= str_replace('pic.tsov.net','pic'.rand(0,1).'.tsov.net',$match[1][$i]);
$content=str_replace($match[1][$i],$tsovnet,$content);
};
return $content;
}
add_filter( 'the_content','setting_pic_tsov_net',12);
?>
上面的程式碼作用就是把你日誌中的圖片路徑進行隨機的替換。
都綁定到wp-content/uploads/下。
若你的一個頁面上圖片不是很多很多的話。就好不要有過多的子網域(網域解析也要是時間呀)。一般控制在2-3個夠了。大致可以這個計算一下:一個子網域同時下載5個,那麼同一時間裡你有多少個需要下載,對應就除以5就是你要用子網域數了。
以上只是我最初的一個實現方法,後來發現採用隨機數rand(0,1)圖片的路徑經常變,這對搜尋引擎也許不太好,最好固定,於是我用這麼用:
$tsovnet= str_replace('pic.tsov.net','pic'.substr(decbin(md5($match[1][$i])),-1).'.tsov.net',$match[1 ][$i]);
這句就不解釋了,太累贅了。不過終於實現我最終的目的了。
當然,上面牽涉到很多其它優化的問題,我就不多說了。
另外:例如把子網域指向到不同的空間上,每次發表有附件的日誌時,就把附件同步到其它空間上。 (這個同步可以寫個程式用404下載過去等等怪異的好方法)
說了這麼多,大家看時一定一頭霧水吧。那就先體驗一下實現後的效果吧。
原文: http://tsov.net/category/album/
感謝simonsu 的投稿