提醒:本文最后更新于 3863 天前,文中所描述的信息可能已发生改变,请仔细核实。
这段时间是忙碌的。新的一个月,总要写篇文章的,本来想放音乐的,但是觉得那些音乐,留在双十一放比较好,给个预告词:情殇。
言归正传,关于CDN的选择,我只知道七牛和又拍云。
关于七牛我是推荐给普通人的,因为他们大多是国内终端用户,追求的也是免费,并且七牛能一站式解决非结构化数据管理,对于用户来说,只要有我的函数(我即将分享的),直接跟那些卫生巾的效果一样,在平时操作完全木有感觉,却确确实实使用了。(省去用户上传文件到镜像服务器的步骤,只需转发地址即可)代表案例有weico+、csdn、豌豆荚等(除了csdn还算有点名气。。。)
又拍云呢,我只是推荐那些有钱的金主(不花钱不爽)和一些确实有需要的人们,又拍云在节点上和稳定程度(响应解析下载多方面对比),是比七牛好,不过其实大多时候其实两者也不分上下,不过又拍云的管理方式上,相对多样化,它可以有像七牛一样的镜像服务(需申请),也可以针对式存储图像空间,抑或是纯静态文件空间等等,除了第一种,其他的都要自行上传,或者利用API,另可定制做方案空间(详细可浏览其官网查看解决方案,或直接联系客服)。话说API相对成熟,也可以直接提要求。很多优点吧,普通人用不上的优点。属于收费服务,不贵。很便宜。代表案例有知乎、唱吧、天天动听、多看阅读、one一个(腾讯出品)、百姓网等。。(都是大客户)而且,而且,你会有个服务专员,可爱漂亮的妹子。。
CDN工作示例:

接下来就是运用CDN时候,你需要替换那些(静态)文件的地址,手工太麻烦了,说实在的。。。一些简单函数(比如最初的七牛镜像插件),可能并不能对所有链接进行钩子,而且可能会出错。如何用个稍微进阶的函数来解决这些问题,请看如下:
<?php
/*
Build by kn007
*/
define('FocusCDNHost','https://kn007.net');//The blog's web address.
define('FocusCDNRemote','http://kn007.b0.upaiyun.com');//The new URL to be used for rewriting.
define('FocusCDNIncludes','wp-content,wp-includes');//Directories to include in static file matching.
define('FocusCDNExcludes','.php|.xml');//Excludes something from being rewritten if one of the above strings is found in the match.
define('FocusCDNRelative','');//Check this if you want to have links like <wp-content/abc.png> rewritten - i.e. without your blog's domain as prefix.
function do_cdnrewrite_ob_start() {
$rewriter = new FocusCDNRewriteWordpress();
$rewriter->register_as_output_buffer();
}
add_action('template_redirect', 'do_cdnrewrite_ob_start');
class FocusCDNRewriteWordpress extends FocusCDNRewrite
{
function __construct() {
$excl_tmp = FocusCDNExcludes;
$excludes = array_map('trim', explode('|', $excl_tmp));
parent::__construct(
FocusCDNHost,
FocusCDNRemote,
FocusCDNIncludes,
$excludes,
!!FocusCDNRelative
);
}
public function register_as_output_buffer() {
if ($this->blog_url != FocusCDNRemote) {
ob_start(array(&$this, 'rewrite'));
}
}
}
class FocusCDNRewrite {
var $blog_url = null;//String: the blog's URL
var $cdn_url = null;//String: URL of a CDN domain
var $include_dirs = null;//String: directories to include in static file matching, comma-delimited list
var $excludes = array();//Array: strings which indicate that a given element should not be rewritten (e.g. ".php")
var $rootrelative = false;//Boolean: if true, modifies root-relative links
function __construct($blog_url, $cdn_url, $include_dirs, array $excludes, $root_relative) {
$this->blog_url = $blog_url;
$this->cdn_url = $cdn_url;
$this->include_dirs = $include_dirs;
$this->excludes = $excludes;
$this->rootrelative = $root_relative;
}
protected function exclude_single(&$match) {
foreach ($this->excludes as $badword) {
if (stristr($match, $badword) != false) {
return true;
}
}
return false;
}
protected function rewrite_single(&$match) {
if ($this->exclude_single($match[0])) {
return $match[0];
} else {
if (!$this->rootrelative || strstr($match[0], $this->blog_url)) {
return str_replace($this->blog_url, $this->cdn_url, $match[0]);
} else {
return $this->cdn_url . $match[0];
}
}
}
protected function include_dirs_to_pattern() {
$input = explode(',', $this->include_dirs);
if ($this->include_dirs == '' || count($input) < 1) {
return 'wp\-content|wp\-includes';
} else {
return implode('|', array_map('quotemeta', array_map('trim', $input)));
}
}
public function rewrite(&$content) {
$dirs = $this->include_dirs_to_pattern();
$regex = '#(?<=[(\"\'])';
$regex .= $this->rootrelative
? ('(?:'.quotemeta($this->blog_url).')?')
: quotemeta($this->blog_url);
$regex .= '/(?:((?:'.$dirs.')[^\"\')]+)|([^/\"\']+\.[^/\"\')]+))(?=[\"\')])#';
return preg_replace_callback($regex, array(&$this, 'rewrite_single'), $content);
}
}
?>
该函数参考七牛镜像插件、w3tc插件等,放置于functions.php即可工作,有5个自定参数,分别为本地地址、远程地址、目录钩子、排除关键字、相对网址支持。具体应该不用多说吧?如果你有不明白的可以留言给我。
使用了该函数,你即可轻松使用cdn服务,告别手工修改(本来我认为也不会有人手工修改,大多利用插件。但据我所知,小天同学和大发同学就是一个个文件替换关键字的,我服了)
如果大家想懒,可以搜索插件 CDN Enabler,已经很够用了。
转载请注明转自: kn007的个人博客 的《分享我的CDN钩子函数》

额,表示用不上,我还是喜欢扔自己服务器上。
@Nemo: 阿里云,够快,无所谓。而且大伙们的流量也不大,不需要转移。。。这函数只是给偶们这些穷人用的。。。没钱只能用国外服务器。。。
@kn007: 你的速度其实还可以,就是哎折腾的人
@Nemo: 也就还可以罢了。。
@kn007: 我属于没钱的
所以用国外的
@天长地久: 米兔
七牛那個我用了,但是不懂是什麼意思~ 也沒感覺到有什麼效果?
@Uncle.E: 因为你没体会过,中国各地网络商杂七杂八,比如大的有电信、移动、联通,小的又有什么长城,长宽等杂牌乱七八糟,除非你是BGP五线,即便如此,你也要离他近,他访问就越快,但你又不可能每个地区都架设服务器吧,而且我只能告诉你沿海地区都是比较快的,内陆,很多网络速度有时访问你我,并不见得快,这个时候cdn的意义就有了。加上他也能转移你的流量,使大流量访问的时候,服务器负载小。请求数少。
@kn007: 貌似明白一點了,就是說節點多,不同運營商線路訪問的速度都能加快是麼~
@Uncle.E: 因为节点分布各地,这样就离终端客户近了,而且线路好(一般都是多线路,或直接bgp)。这样访问就快了。所谓cdn加速就是如此,只是整站加速,一般是要钱的。so,大多会选择静态文件加速。。
@kn007: 那七牛那個是怎麼個意思呢?直接填個網址就好了~
@Uncle.E: 就是镜像的意思,它自动复制你的。
@kn007: 那用戶訪問我網站的時候就不消耗我的流量了?
@Uncle.E: 是啊。只要七牛有了镜像文件,他就不再请求你的服务器了,一般有过期时间(默认7天)也有可能没有,过期后会重新请求
@kn007: 最後一個問題,那我更新了博文,前臺也很快就更新出來了,不是需要等一段時間的麼~
@Uncle.E: 不需要。只要文件存在,他就能快速请求到,别忘了,它不止离用户近,离你也近。延迟很小的,他们的响应和解析一般为0ms,七牛不太稳定,在0~50ms这个区间,剩下的就是下载时间了,也很短,除非你文件很大
我来试试七七的高性能CDN钩子~~~~~

@郑杰: 你之前不是要么,现在分享了,拿去玩吧。
这玩意看的我眼晕呼呼的。
@啄木游弋:
好吧。。。
长姿势了,试试看有没有效果,美国线路抽啊。
@be.truth: 哈,有帮助就好
@kn007: 如果wp安裝在子目錄下面例如我的就是domain/wordpress下
define('FocusCDNIncludes','wp-content,wp-includes') 是不是要改成wordpress/wp-content 和wordpress/wp-includes
@be.truth: 不需要,不过我也没试过
@kn007: 哦,我去白鼠一下。另外七牛的文件同步在管理面板能看到是不是需要一段時間才可以顯示出來。
@be.truth: 是的。。
你知道用卫生巾是什么感觉?
@不给力的面条: 我只知道卫生巾追求的感觉就是让你没有感觉
用自己改的程序上传并调用文件,不喜欢wp后台的上传- -
@Tokin: 本函数不含上传功能。
@kn007: 要自己上传wp-content到七牛吗?
@be.truth: 七牛属于镜像,不需要上传。
@kn007: 七牛的空间管理界面到现在没看到文件,不知道怎么回事了。再观望几天。
@be.truth: 你生效了没嘛。。。你没生效,肯定就木有啊
@kn007: 是镜像,但是没有说申请什么的阿?今天又多了一个文件robots.txt,现在只有两个文件,另一个是favicon
@be.truth: 你新建好空间就行了。。然后在后台设置一键加速。接着把七牛给你的地址,写到远程参数。
@kn007:
var $blog_url = null;//String: the blog's URL
var $cdn_url = null;//String: URL of a CDN domain
var $include_dirs = null;//String: directories to include in static file matching, comma-delimited list
var $excludes = array();//Array: strings which indicate that a given element should not be rewritten (e.g. ".php")
var $rootrelative = false;//Boolean: if true, modifies root-relative links
define 那边改了,这里是不是也要改?
@be.truth: 不需要,只改define,注意地址结尾不要斜杠
怎么看你的代码“出界”了呢?难道是我这边浏览器不好,好多天没过来看看了,围观一下……
@LuOpera: 我用ie都没出界。。。
博主好人一生平安
@咕噜噜:
总感觉我这里突变成某种论坛。。
我个人就是直接上传的主题文件夹,直接替换掉相应的静态文件网址,即把php语言静态化又无需插件,岂不是很好?话说主题静态文件也就那几个啊,一个个来也不麻烦的
对于又拍和七牛,各有优点,又拍在解析和响应速度上确实占有优势,七牛在节点数量上有优势,两者下载速度基本相当,七牛最大的优点就是在现有CDN市场超高的性价比啊,而且像传统cdn一样便捷
两家的MM客服都很赞,我在又拍申请了800元优惠,七牛500元,都一下通过啦
@零度: 是的。虽然说全静态化肯定更好。不过我习惯了可控,我追求的是php需要执行且能获得最快的速度。效率算法