WordPress优化(2):cacheAsFile静态网页
前面有写过一篇如何Gzip压缩CSS和JS文件的优化WordPress心得(1),现在又有时间整理优化心得了。
Cache Function As File(缓存函数结果到文件)这句话是学的Flash AS程序中的cacheAsBitmap ,在Wordpress中主要是缓存一个函数的返回结果到一个文件,供下次使用。然而有这个必要吗?
我使用到的站点地图插件Dagon Design Sitemap Generator,每次访问都会查询整个数据库,然后根据一定算法做字符串拼接处理,这样来生成出看到的成站点地图的html代码,但随着文章的增多,现在仅站点地图生成的html字节大小已达120K。
同样,通常在主题上存在的档列表,标签云,分类列表,友情链接这样的列表,而这些类容通常更新频率并不高,而默认情况下是每次访问都需要查询数据库再进行字符串拼接来动态生成。数据库、服务器每次都需要进行重复的运算。这样网页打开的速度慢了,服务器的负荷也上去了,性能的瓶颈产生了。
如果将这些列表函数生成的html内容缓存到文件,下次使用只需要读取输出即可,而不需要进行数据的查询和字符串拼接。web server只管输出内容即可,这样很大程度上减低的服务器负担。
这样一台服务器上就可以放更多的网站,可以承受更高的突发访问量。还可以xxx,还可以xxx,哈哈,已说得天花乱坠… 不过话说回来,其实就是静态话的好处。
首先将cacheAsFile函数声明到wp-config.php中的代码部分。函数代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function cacheAsFile($function,$cache_file,$args_array = array(),$cache_time = 86400){ $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 缓存时间,单位是秒,默认是一天过期。可选参数
创建wp-cache文件存放目录
如果你的网站根目录下没有wp-cache目录,请手动创建,同时linux下请确保好读写权限。
找到需要cache到文件的函数,需要是有返回值的底层函数,而不是带了echo输出的。同样以Dagon Design Sitemap Generator为列,找到插件文件sitemap-generator.php,在其代码中找到 str_replace(’<!– ddsitemapgen –>’ 所在行。我的是在1266行。ddsg_create_sitemap为带返回值的函数。这个就是核心功能代码。他的返回值会替换内容中的<!– ddsitemapgen –>
这里可需要一些代码知识哦。有点门槛。
开始使用cacheAsFile函数
使用在Dagon Design Sitemap Generator
使用在需要附加参数的功能函数中
检查wp-cache下生成的cache文件
如果不出意外cache开始生效了,在这个目录下应该能够看到相应的缓存文件。可以清理掉相应缓存文件来达到更新的目的。
后续
这个方法也不只是仅仅适用于Wordpress、php,将基本思想移植到其他的环境下一样的会有好的效果。
OK,分享一下自己的优化技巧,如有更多更好的方法以及深入探讨以评论的方式交流吧。