关于wordpress的优化
因为从9月份开始,博客的访问量上升的很快,而且5G的流量一下子就用完了,厚着脸皮找服务商要了2G,但照现状,如果不作下适当的优化,估计这2G也会很快耗尽的。对于PHP,我完完全全是个菜鸟,在网上搜到很多方法,但用起来总不那么尽人意,昨天花了点时间,再次去Google了下,下面把搜到的一些资料略整理了下,感谢cbm‘s land的分享精神!当然下面的方法不一定适合你,很多人喜欢简单,那么你也可以选择安装插件wp-cache。
一、Gzip压缩CSS和JS
注:服务器必须支持gzip,Rewrite功能。(已前几个版本后台好像有这个开关,但现在2.6以上的都没有了)
1、在根目录的.htaccess里面加上:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
这样可以让所有的css和js文件访问就以相对根目录的路径以GET变量传递到了gzip.php,交给gzip.php来全权处理了。
2、在根目录创建gzip.php,代码如下:
define(‘ABSPATH’, dirname(__FILE__).’/');
$cache = true;//Gzip压缩开关
$cachedir = ‘wp-cache/’;//存放gz文件的目录,确保可写
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘gzip’);
$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘deflate’);
$encoding = $gzip ? ‘gzip’ : ($deflate ? ‘deflate’ : ‘none’);
if(!isset($_SERVER['QUERY_STRING'])) exit();
$key=array_shift(explode(‘?’, $_SERVER['QUERY_STRING']));
$key=str_replace(‘../’,”,$key);
$filename=ABSPATH.$key;
$symbol=’^';
$rel_path=str_replace(ABSPATH,”,dirname($filename));
$namespace=str_replace(‘/’,$symbol,$rel_path);
$cache_filename=ABSPATH.$cachedir.$namespace.$symbol.basename($filename).’.gz’;//生成gz文件路径
$type=”Content-type: text/html”; //默认的类型信息
$ext = array_pop(explode(‘.’, $filename));//根据后缀判断文件类型信息
switch ($ext){
case ‘css’:
$type=”Content-type: text/css”;
break;
case ‘js’:
$type=”Content-type: text/javascript”;
break;
default:
exit();
}
if($cache){
if(file_exists($cache_filename)){//假如存在gz文件
$mtime = filemtime($cache_filename);
$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’;
if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
array_shift(explode(‘;’, $_SERVER['HTTP_IF_MODIFIED_SINCE'])) == $gmt_mtime)
){
// 浏览器cache中的文件修改日期是否一致,将返回304
header (“HTTP/1.1 304 Not Modified”);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Cache Not Modified (Gzip)”);
header (‘Content-Length: 0′);
}else{
//读取gz文件输出
$content = file_get_contents($cache_filename);
header(“Last-Modified:” . $gmt_mtime);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Normal Respond (Gzip)”);
header(“Content-Encoding: gzip”);
echo $content;
}
}else if(file_exists($filename)){ //没有对应的gz文件
$mtime = mktime();
$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’;
$content = file_get_contents($filename);//读取文件
$content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);//压缩文件内容
header(“Last-Modified:” . $gmt_mtime);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Build Gzip File (Gzip)”);
header (“Content-Encoding: ” . $encoding);
header (‘Content-Length: ‘ . strlen($content));
echo $content;
if ($fp = fopen($cache_filename, ‘w’)) {//写入gz文件,供下次使用
fwrite($fp, $content);
fclose($fp);
}
}else{
header(“HTTP/1.0 404 Not Found”);
}
}else{ //处理不使用Gzip模式下的输出。原理基本同上
if(file_exists($filename)){
$mtime = filemtime($filename);
$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’;
if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
array_shift(explode(‘;’, $_SERVER['HTTP_IF_MODIFIED_SINCE'])) == $gmt_mtime)
){
header (“HTTP/1.1 304 Not Modified”);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Cache Not Modified”);
header (‘Content-Length: 0′);
}else{
header(“Last-Modified:” . $gmt_mtime);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Normal Respond”);
$content = readfile($filename);
echo $content;
}
}else{
header(“HTTP/1.0 404 Not Found”);
}
}
?>
3、在根目录创建wp-cache文件夹,给755或者777写权限。
二、cacheAsFile 缓存函数结果到文件 选择性静态化
Cache Function As File它的意思就是缓存函数结果到文件,通常在主题上存在的存档列表,标签云,分类列表,友情链接这样的列表,而这些类容通常更新频率并不高,而默认情况下是每次访问都需要查询数据库再进行字符串 拼接来动态生成。数据库、服务器每次都需要进行重复的运算。这样网页打开的速度慢了,服务器的负荷也上去了,性能的瓶颈产生了。
如果将这些列表函数生成的html内容缓存到文件,下次使用只需要读取输出即可,而不需要进行数据的查询和字符串拼接。web server只管输出内容即可,这样很大程度上减低的服务器负担。
1、首先将cacheAsFile函数声明到主题functions.php中。(原文是说放到wp-config.php里面,试了下貌似不行,于是我就改了位置)函数代码如下:
$filename = ABSPATH.’wp-cache/’.$cache_file;
if(file_exists($filename) && time() < filemtime($filename) + $cache_time ){
$handle = fopen($filename, “r”);
$contents = fread($handle, filesize ($filename));
fclose($handle);
return $contents;
}else{
$contents = call_user_func_array($function,$args_array);
if($contents){
if (!$handle = fopen($filename, ‘w’)) {
echo “不能打开文件 $filename”;
exit();
}
if (!fwrite($handle, $contents)) {
echo “不能写入到文件 $filename”;
exit();
}
fclose($handle);
}
return $contents;
}
}
使用参数说明
- $function 需要cache住的功能函数,必须是带返回值的函数
$cache_file 缓存文件名
$args_array 参数集,以数组形式封装传递给指定的功能函数。可选参数
$cache_time 缓存时间,单位是秒,默认是一天过期。可选参数
2、找到需要cache到文件的函数,需要是有返回值的底层函数,而不是带了echo输出的。
使用在 simple Tags 的标签云
使用最近评论的列表
同样以Dagon Design Sitemap Generator为列,ddsg_create_sitemap为带返回值的函数。这个就是核心功能代码。他的返回值会替换内容中的[!--– ddsitemapgen –--]找到:
替换为:
三、图片和下载防盗
同样利用服务器的rewrite功能,在.htaccess文件里增加如下两个代码,第一个是图片防盗,第二个是下载防盗。
RewriteRule \.(jpggifpngbmp)$ http://shamas.me/images/403.jpg [R=301,L,NC]
RewriteRule (download/[0-9]+/.*$\.(rarzipexechmtorrent)$) http://shamas.me/ [R=301,L,NC]


我的网站,被误判成SPAM了,现在没办法解决,
已给Akismet反馈过两次了,还不见纠正,唉。。。