在Wordpress中文论坛上曾看到一网友的帖子,讨论如何建立博客镜像的问题。要求不同地址的WP博客可以显示同样内容,其中一个博客负责帖子的管理,而镜像博客只负责内容输出。既然要求是镜像,所有内容都需自动完成,所以利用Live Writer等编辑软件分开发布等手法都不属于讨论范围之内。稍微分析一下,实现博客镜像并非不可能,其中涉及二个方面的问题。
一是数据库问题。因为Wordpress的主要内容和配置都放置在数据库内,而页面内容都是动态查询数据库生成的。所以只要能够共享到数据库。镜像问题就可以解决了。
二是永久链接问题。因为主博客和镜像博客的地址是不一样的,所以要求Wordpress博客内的文章,目录,页面等浏览用的永久链接都是根据各自的地址动态生成的。而正因为WP的链接是动态生成的特性,如果能有效利用的话,此问题也就不再是问题了。
我个人对建立博客镜像并不以为然,然而作为WP的Fan,从技术方面探讨其可行性倒是蛮有兴趣。在论坛上看此讨论后,我在本地做了个测试,结果发现,仅需简单地利用wp-config.php对相关选项定义后,完全可以实现二个博客之间的同步。下文中将以主博客和镜像博客用以区分二个博客。
前提
根据上面分析的二个方面,要实现镜像,假设下列前提都必须得以满足。
1. 数据库可以共享。镜像博客必须共享主博客的数据库,所以在wp-config.php中,二者对应的数据库名,帐号和密码必须完全一致。如果镜像博客和主博客位于同一主机上的话,也不存在数据库地址的问题了,(通常都为localhost)。若二者位于不同主机,主博客的数据库必须支持远程登录,否则的话就无法实现镜像。
2.为了保持一致,镜像博客的wordpress目录结构和文件必须完全和主博客一致。即模板文件,插件文件以及.htacess文件必须全部一样。但因为WP是用绝对地址来设置文章中图片和附件等,所以镜像文件可以不需要建立那些在主博客中保存图片或附件的目录。通常是\wp-content\uploads。
1. 建立镜像博客,将wp文件上传到镜像博客的wp目录,然后将主博客中使用的模板以及插件分别上传到镜像博客的相关目录下。注意,目录结构和模板插件文件必须相同。我是用xampp搭建本地服务器,然后在本地调试的,在本地下分别建立了wp251和mirror目录,使用wp官方2.5.1版程序。前者的url为:http://localhost/wp251,设定为主博客。后者url为:http://localhost/mirror,作为镜像博客。
用phpmyadmin建立一个数据库wp251,并将现有ThinkAgain博客的数据备份导入。
用文本编辑软件如notepad++打开主博客wp251的wp-config.php,设定其数据库参数和定义wp和博客的绝对地址。如下图,点击可查看大图:
设定主博客的数据库为wp251,用户名和密码为root和123456,定义了主博客的wp安装目录的绝对地址(WP_HOME)为http://localhost/wp251;博客的地址(WP_SITEURL)为http://localhost/wp251。注:主博客可不定义wp地址和博客地址。
接着编辑镜像博客mirror的wp-config.php,如下图:
可以看出,该wp-config.php将镜像博客的数据库设定为和主博客一样,均为wp251,用户名和密码为root和123456。也就是说镜像博客将共享使用主博客的数据库,这是问题一的解决方法。
但注意定义了镜像博客的wp地址为http://localhost/mirror;博客的地址为http://localhost/mirror。这是其不同之处。由于WP_HOME和WP_SITEURL是全局变量,这样即使数据库中的定义的WP安装和博客地址为http://localhost/wp251,而Wordpress在运行中将会使用http://localhost/mirror来生成永久链接。这样就解决了问题二。
通过wp-config.php指定二者的位置后,在后台的设置页面可以发现,这二个选项将会以灰色显示,无法编辑。
p.s,wp安装目录和博客目录分别被保存在数据库中wp_options表的第40项,在wp_options第1项。
3.更新.htacess文件
即使已经将主博客的.htacess上传到镜像博客的wp根目录下,仍需要到镜像博客的后台重新更新下永久链接。注,无需修改链接格式,仅点击更新按钮即可。
4.查看效果
分别打开主博客或镜像博客的页面,对照下面2个抓图,可以看到二者界面和内容完全一致。但地址和链接等是不一样的。图中红色方框处。
主博客抓图
只要在镜像博客\wp-content\plugins下上传有相同插件。镜像博客也可以完全正常使用插件。上图右边红色方框处是插件生成的代码,这个是我的wp_addbookmarks插件生成的。新添加了半透明的css效果。
到此为止,二个网站已经基本实现同步了。无论是在线或者利用离线编辑软件如live writer等往主博客发表文章后,镜像博客将会立即输出同样内容。因为它们共享同一个数据库来输出内容的。
可以在主博客管理博客的设置,因为共享数据库,所以所做的设置更改也会立即在镜像博客上有效。如果涉及文件修改等,请务必修改镜像博客中的相应文件。
讨论-可能存在的问题
即使成功地将二个博客同步,但仍可能存在些问题。主要为插件方面的兼容性问题。因为插件的涉及面太广,所以我没有去测试过,只能在这里提出一些来互相探讨。
1. 一些涉及永久链接管理的插件,如链接转向,或自定义链接等插件可能无法正常运行在镜像博客上。
2. 博客的统计问题,涉及博客统计的插件,如postview等,将会同时统计二个博客的页面浏览状态,所以在页面显示的浏览量等为主博客和镜像博客的浏览量的总和。
3. 涉及数据库读写或管理的插件可能会不正常。按理来说,虽然镜像博客的插件在运行中会往数据库中写东西不会影响到主博客的运行,但是要注意,如果往数据库内写入含有站点永久链接的内容,那么将会出现问题。因为二个站点的永久链接是不一样的。而数据库内使用同样的永久链接,会造成链接指向絮乱。
4.RSS输出问题,二个博客的rss内容虽然一样,但是需注意主博客和镜像博客的wordpress默认的输出feed地址是不一样的。所以如果在模板中调用wp自带函数用于rss订阅地址输出的话,可能会导致分散了订阅者。这个问题可以通过整合feed地址来解决。将主博客的feed地址提交给feed管理的站点,如feedburner或feedsky,然后在模板中只放置feed管理站点提供的整合后feed地址就可以了。
本文是我根据本地测试的结果总结出来的。用于抛砖引玉,实际建立远程镜像的步骤大同小异,但涉及具体的问题,如插件等,需要根据自己的实际情况而定后再分析解决。为此,建议先在本地测试下,然后再做定夺。
转载文章请注明转载自:ThinkAgain - Let's Blog!































2008.05.06 Tuesday 11:30 am
上课时在手机上看到这篇文章,回来后意犹未尽,用电脑又重新看了一遍,很不错。
2008.05.06 Tuesday 11:48 am
其實如果用MYSQL本身的鏡像功能,也可以做到數據庫也分離開。只是要求鏡像和主機之間的通訊正常,而且擁有自己的主機,一般租用的虛擬主機都不能手動去設置MYSQL的參數。
2008.05.06 Tuesday 4:45 pm
To 9NPC,同意此观点。注意,如果镜像mysql的地址不一样的话,需在wp-config.php中明确设置。
2008.05.07 Wednesday 7:45 am
[...] WordPress Hacks:如何打造WP博客的镜像? [...]
2008.05.07 Wednesday 2:31 pm
mysql也放在一个地方,这样的wp镜像,我以为就只是装酷而已了(还不是一个崩溃全完蛋,相当于只有一个),呵呵。可以用mysql的镜像同步功能,放在不同的地方,这个很多虚拟主机商似乎都有提供(现在流行cache啊)。
2008.05.08 Thursday 12:55 pm
博主你好!非常喜欢你独立日志页面,文章最下面的FeedMe效果,不知道是如何制作的,是插件实现么?还是直接使用thickbox,我是新手,如果你不介意的话,可否把你的Emial个给我?谢谢!~~
2008.05.08 Thursday 5:31 pm
To patrick: 是通过thickbox来实现的。thickbox代码是自行添加到模板内。具体thickbox的使用可以参考:http://jquery.com/demo/thickbox/
2008.05.10 Saturday 9:11 pm
镜像会不会对搜索引擎产生不良影响?
2008.05.18 Sunday 2:34 pm
恐怕大多数想做镜像的都不是在同一个服务器,
最好写一个程序定时对主博客feed进行内容抓取后输出比较好
2008.05.21 Wednesday 9:40 am
两个数据库之间同步不知道可不可以做。
2008.05.21 Wednesday 11:52 am
To zhang: 据网友9NPC留言,现在很多空间商提供mysql镜像,如果有这样服务的话,数据库之间同步应该就可以实现。不过,个人没尝试过。对于个人博客而言,镜像并不是很需要的。
2008.06.03 Tuesday 4:18 pm
我觉得我的方法还行,就是写一个插件,这个插件的功能就像Live Writer一样的,在两个博客都安装这个插件,不管哪一个博客发布新文章或者有新留言,博客除了将数据存入自己的数据库之外,还通过API请求将数据同时写入另一个博客, 这就应该能达到完全镜像
2008.06.23 Monday 10:40 pm
看了但是还是不太理解!
2008.11.14 Friday 6:12 am
我是用本地实现的。主要是解决空间IP被封问题
数据库同一个,PHP则放到两个空间上,两个空间都绑同一个域名。
本地解析到能访问的空间,更新时被封IP那个空间也及时更新了
2009.03.29 Sunday 2:10 pm
咦··
还是有难度··
2010.02.09 Tuesday 8:48 pm
我的免费空间又挂掉了,所以我觉得博客镜像很重要,但是MySql数据库总是不能远程调用,无法解决。
子与你提到的文章中固定链接的问题,可以用php变量来代替,url中的网站部分,当然,需要插件的支持,因为文章中的php代码会被注释掉的。