为 Mediawiki 制作七牛云存储插件
- 2015-01-03
- 编程
- #Mediawiki #七牛
- 2018-08-25 07:02:25
我之前因为用过七牛的wordpress插件,感觉效果不错。最近在用 mediawiki 搭建一个百科网站,也想尝试用七牛来给网站加速。
现状
一个使用mediawiki作为后台的百科网站:http://example.com ,一个建好了的七牛空间,绑定好了子域名 yun.example.com 并且做了cname解析。
目标
在不改变原网站文件(目前是图片)存储逻辑的基础上,为图片做七牛存储,通过七牛的空间访问资源文件,从而加速网站。
具体做法
看了一些 mediawiki 插件开发与七牛的开发文档之后,我发现 mediawiki有 点复杂难懂,最终只实现了一种最初级简单的方法:将 mediawiki 生成的网页,在显示之前,替换掉其中的图片链接为七牛链接。利用七牛的镜像存储功能,自动做图片文件的镜像。
首先在七牛的空间设置那里开启镜像存储:
然后在插件目录(/extension/QiniuImage)中放入主要的代码(QiniuImage.php):
<?php if ( !defined( 'MEDIAWIKI' ) ) { exit; } $wgExtensionCredits['other'][] = array( 'path' => __FILE__,
'name' => "QiniuImage",
'description' => "Replace image src from localhost to qiniu cloud storage",
'version' => 1.0,
'author' => "qqjt",
'url' => "https://low.bi/p/7eRDxj6xLYM",
);
$wgHooks['AfterFinalPageOutput'][] = 'qiniuImageSourceReplace';
function qiniuImageSourceReplace( $output )
{
$out = ob_get_clean();
// change final html in $out
global $wgQiniuDomain;
$out=str_replace("/images", "http://".$wgQiniuDomain."/images", $out);
ob_start();
echo $out;
return true;
}
利用了 mediawiki 的 AfterFinalPageOutput 这个 hook,一个简单粗暴的str_replace() 方法。
使用:
在LocalSetting.php中加入:
require_once "$IP/extensions/QiniuImage/QiniuImage.php";
$wgQiniuDomain = "xxxxxx";
其中xxxxxx是七牛存储空间对应的七牛域名(或者绑定的自定义域名),不包含 http:// 与结尾的 “/”。
可能的问题与后续方向
因为是简单的开启了镜像,在文件有更新的时候,不能够及时更新镜像文件,我甚至不清楚,如果文件名没变化的话,镜像文件到底会不会更新。
后来我发现,使用了AfterFinalPageOutput这个hook的插件,在mediawiki官网上寥寥无几,果然这个不是主流的做法啊。
之后我应该会更深入地研究下mediawiki的文件存储和文本解析机制,争取做个更完善的插件出来。