Redis是一个高级的keyvalue存储系统,类似memcached,所有内容都存在内存中,因此每秒钟可以超过10万次GET操作。
我下面提出的解决方案是在Redis中缓存所有输出的HTML内容而无需再让WordPress重复执行页面脚本。这里使用Redis代替Varnish设置简单,而且可能更快。
安装Redis
如果你使用的是Debian或者衍生的操作系统可使用如下命令安装Redis
aptgetinstallredisserver
或者阅读安装指南
使用Predis作为Redis的PHP客户端
你需要一个客户端开发包以便PHP可以连接到Redis服务上。
这里我们推荐Predis.上传predis到WordPress的根目录。
前端缓存的PHP脚本
步骤1 在WordPress的根目录创建新文件withredis,内容如下
- Changethesetwovariables:
- $seconds_of_caching=60 60 24 7;7days.
- $ip_of_this_website='204.62.14.112';
- ThisfileiswrittenbyJimWestergren,copyrightallrightsreserved.
- Seemorehere:jimwestergrenwordpresswithredisasafrontendcache
- Thecodeisfreeforeveryonetousehowtheywantbutpleasementionmynameandlinktomyarticlewhenwritingaboutthis.
- Change$ip_of_this_websitetotheIPofyourwebsiteabove.
- Add?refresh=yestotheendofaURLtorefreshit'scache
- Youcanalsoentertheredisclientviathecommandpromptwiththecommand"rediscli"andthenremoveallcachewiththecommand"flushdb".
- VerynecessaryifyouuseCloudfare:
- ifisset$_SERVER['HTTP_CF_CONNECTING_IP']{
- $_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP'];
- }
- ThisisfromWordPress:
- define'WP_USE_THEMES',true;
- Startthetimer:
- functiongetmicrotime$t{
- list$usec,$sec=explode"",$t;
- returnfloat$usec+float$sec;
- }
- $start=microtime;
- InitiateredisandthePHPclientforredis:
- include"predis";
- $redis=newPredis/Client'';
- fewvariables:
- $current_page_url="".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
- $current_page_url=str_replace'?refresh=yes','',$current_page_url;
- $redis_key=md5$current_page_url;
- Thisfirstcaseiseithermanualrefreshcachebyadding?refresh=yesaftertheURLorsomebodypostingacomment
- ifisset$_GET['refresh']||substr$_SERVER['REQUEST_URI'],12=='?refresh=yes'||$_SERVER['HTTP_REFERER']==$current_page_url$_SERVER['REQUEST_URI']!=''$_SERVER['REMOTE_ADDR']!=$ip_of_this_website{
- require'.wpblogheader';
- $redisdel$redis_key;
- Secondcase:cacheexistinredis,let'sdisplayit
- }elseif$redisexists$redis_key{
- $html_of_current_page=$redisget$redis_key;
- echo$html_of_current_page;
- echo"!Thisiscache
- third:anormalvisitorwithoutcache.Anddonotcacheapreviewpagefromthewpadmin:
- }elseif$_SERVER['REMOTE_ADDR']!=$ip_of_this_websitestrstr$current_page_url,'preview=true'==false{
- require'.wpblogheader';
- $html_of_current_page=file_get_contents$current_page_url;
- $redissetex$redis_key,$seconds_of_caching,$html_of_current_page;
- echo"!Cachehasbeenset
- lastcase:thenormalWordPress.Shouldonlybecalledwithfile_get_contents:
- }else{
- require'.wpblogheader';
- }
- Let'sdisplaysomepagegenerationtimenote:CloudFlaremaystripo utcomments:
- $end=microtime;
- $t2=getmicrotime$endgetmicrotime$start;
- if$_SERVER['REMOTE_ADDR']!=$ip_of_this_website{
- //Vevb.com
- echo"!CachesystembyJimWestergren.Pagegeneratedin".round$t2,5."seconds.
- }
或者直接下载withredis
步骤2 将上述代码中的IP替换成你的IP
步骤3 在.htaccess中将所有出现的地方改为withredis,如果你使用的是Nginx则修改nginx.conf中的为withredis并重载Nginx killallsHUPnginx。
性能测试
1.没有Redis的情况下,平均执行1.614秒,页0.174秒无任何缓存插件
2.使用Redis的情况下,平均页面执行时间0.00256秒
我已经在我的博客中使用了如上的方法进行加速很长时间了,一切运行良好。
其他建议
我的环境是Nginx+PHPFPM+APC+Cloudflare+Redis.安装在一个nanoVPS中,无缓存插件。
请确认使用了gzip压缩,可加快访问速度。
访问wpadmin
要访问wpadmin必须使用wpadmin代替原来的wpadmin.
新闻热点
疑难解答
图片精选