为 Mediawiki 制作七牛云存储插件

我之前因为用过七牛的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的文件存储和文本解析机制,争取做个更完善的插件出来。