提醒:本文最后更新于 3377 天前,文中所描述的信息可能已发生改变,请仔细核实。
这段时间是忙碌的。新的一个月,总要写篇文章的,本来想放音乐的,但是觉得那些音乐,留在双十一放比较好,给个预告词:情殇。
言归正传,关于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服务,告别手工修改(本来我认为也不会有人手工修改,大多利用插件。但据我所知,小天同学和大发同学就是一个个文件替换关键字的,我服了)
转载请注明转自:kn007的个人博客的《分享我的CDN钩子函数》
至今还不明白什么是钩子
@无纯洁: hook呢?
@kn007: hook?好像就是钩子
@无纯洁:
好歹明白了。。
稍后阅读!系统正在make中。。-v- [评论稍后奉上!
@Sheephe: 你的评论呢。。
每个月100G流量几多米?
@Zeraba: 用得了这么多吗?流量没有限期的哦,即便一个月100G也才55元,推荐定制,虽然我不知道定制是啥样的,不过100G也不小了。空间配额有时间限制,1G1年2.95元记得是
我用着鱼叔那插件,最近版本加入了广告,我考虑是不是该换代码来着。。
@CY's BLOG: 哈,可以考虑。我一般不用插件。
次奥,终于知道了。。手工替换好多次了。。
@wordpress主题:
额,是么。。
FocusCDNRelative 这个怎么设置 请问? 请指教
@霸唱天下℡: 下次不要过来发那种链接哈,发点有意义的。
要排除某个具体的文件,比如123.js,是不是写完整的文件名就可以了
@生活有意思: 这个自己试了,就是这样。。。
@生活有意思: 这个没错的,只要存在字符就排除
求教博主,我如果用了第三方的编辑器插件,类似kindeditor这样的,图片上传到网站,但是没有添加到媒体库,这样的图片地址是不会替换的~
这样有没有办法替换呢,感谢。
@生活有意思: 我的钩子,直接勾网页,不关你编辑器问题,除非你图片的地址不是你的域名。你可以看下是否为相对地址,我里面已经做好参数
@kn007: 非常感谢,确实是相对路径的问题,太感谢了,这个困扰我好久了,在您这给解决了~
@生活有意思: 不客气。
不知道为啥,同样的代码,我的VPS没问题。虚拟主机就有问题。。虚拟主机是CP管理面板应该是LAMP,VPS是LNMP环境。。
@WordPress主题: 可以看一下38楼。虚拟主机正常是没问题,你可以打开debug,看看是不是函数被限制了。不关A或N的问题。
https://kn007.net/topics/cdn-share-my-hook-function/comment-page-4/#comment-12267
@kn007:
我用w3tc就能。。好奇怪。
@WordPress主题: 这个跟w3tc原理差不多。我以前也用w3tc,主要是现在cache都是程序化了。不用这种模式了。w3tc就只剩cdn功能用得上,感觉就臃肿了,所以自己写了个。
你可以试试debug下
@kn007: 我也觉得臃肿,一大堆,但是不会DEBUG。可以帮忙看下不。可以的话我关闭插件,上传这个钩子。。
@WordPress主题: 直接wp-config的debug先开了看看。
@kn007: 太恐怖了。www.win8g.com 打开DEBUG之后全部乱码。各种出错。。求查看下。
@WordPress主题: 那些错误是主题的问题。我没看到关于我的钩子的错误。你可以换个主题试试
@kn007:
多谢了哈。
看似这么长的代码,用起来就只要改最开始几个地方,1024个赞,
头像也有效么?我现在头像还是用的木木木的代码缓存在七牛的,如果要又拍cdn的话是应该要先缓存到本地对吧
@小怪物: 头像不会哦,除非头像地址是你域名。
@kn007: 嗯,我的意思就是停用头像缓存七牛,在用某php代码吧头像从gravatar缓存到本地服务器,也就成了我自己的域名的地址了,然后就可以又拍cdn了吧
@小怪物: 可以
@kn007: 其实我现在的主题评论列表都没有显示头像,感觉提交速度从未如此快过,都不想再加头像了
@小怪物: 。。。好吧
@kn007: 刚才发现个问题,我的文章页面地址变成又拍云的绑定域名了。。。。
@小怪物: 没道理,除非你define FocusCDNIncludes 是空
@小怪物: 简单来说,在FocusCDNExcludes添加.html也是可以的
@kn007: 加了html貌似好了
3q
@小怪物: 最好是 .html ,注意有个“.”
@kn007: 嗯,写了点点