首页 > Wordpress > wordpress中自动同步数据库
2014
07-05

wordpress中自动同步数据库

前些天我的博客“井底之蛙”所在的服务器召攻击了,丢失了一部分数据,这就怪自己没坚持放在SAE上,如果放在SAE就不会有这样的情况发生拉。于是坚定了自己做备份数据的念头,
虽然网上有很多能自动备份数据,如自动发送数据库的sql到邮箱,备份到空间等等各种插件,但是也不知道咋滴,一直没用成功过,于是决定自己写一个,一直都认为代码的乐趣,在于解决自己的需要。wordpress可玩性也在于此。废话不说,说下我的想法:
博客最重要的内容,当然是发表的文章,于是决定从发布文章开始入手,可以在每次发布新文章的时候,备份一下这条数据,初步有两个简单的方法:
1、把数据库导出,然后发送到邮箱以文件的形式保存。
2、把这条数据远程备份到另外一个数据库。
相对来说,远程备份到另一个数据库比较简单,因为方法1先要导出,再要发送,涉及到空间、mail。作为一只非职业码畜,只能选择较为简单的方法。
于是我用了之前创建的两个sae应用做实验,暂时把原本的数据库称为A,备份的数据库称为B吧。要把A的数据备份到B,这里就会涉及到一个传送数据的问题,我们都知道常用的传送数据就是用表单,get、post方式,我们不可能在A中写一个表单,然后action写B的地址。这里有一种方法,那就是Curl(没见过的同学自己百度哈),在A应用中触发发表新文章这个动作时,用curl 把数据post到B的数据库,这样就达到我们的目的了。

我的基本思路就是这样,下面就是敲代码了。在wordpress中,我们要用插件的形式去完成这项工作,而wp中新建插件也很简单直接在wp-content/plugins/目录下创建你要的插件文件夹,然后到文件夹里面创建php文件就好了。比如我在A应用中这样子:
wordpress中自动同步数据库 - 第1张  | 最后的面包

下一步就是往里面敲代码了。
PHP代码

  1. /* 
  2. *@backage backupdb 
  3. * @version 1.6 
  4. */  
  5. /* 
  6. Plugin Name: backupdb//这里是插件名称 
  7. Plugin URI: http://aoxiang.me//这里是插件链接的地址,这里链接的是我的博客,井底之蛙 
  8. Description: when you publish a new post, this plugin will backed up data to anthor database that you set ;//这里是你插件的简介 
  9. Author: Luffy//author 
  10. Version: 1.0//版本 
  11. Author URI: http://aoxiang.me 
  12. */  
  13. /* 
  14. Plugin Name、Plugin URI、Description、Author、Version等等这几项建议大家都写上,不写有时候wp会不识别插件 
  15. */  
  16. //函数中传入的是发表的新文章,写入A数据库以后,生成的post_id  
  17. function backupdb($post_id)  
  18. {  
  19.     //下面我们通过这个postid,取得A数据库中的这条数据  
  20.   $post_data = get_post($post_id);  
  21.       
  22.     //由于wp中取得的数据是对象(-_-###PHP居然是个有对象的语言,为毛我等码畜无对象!!!)的形式,我习惯了用数组的形式去处理数据,所以这里我把它全部改成了数组。  
  23.   $data[‘id’] = $post_data->ID;  
  24.   $data[‘post_author’] = $post_data->post_author;  
  25.   $data[‘post_date’] = $post_data->post_date;  
  26.   $data[‘post_date_gmt’] = $post_data->post_date_gmt;  
  27.   $data[‘post_content’] = $post_data->post_content;  
  28.   $data[‘post_title’] = $post_data->post_title;  
  29.   $data[‘post_excerpt’] = $post_data->post_excerpt;  
  30.   $data[‘post_status’] = $post_data->post_status;  
  31.   $data[‘comment_status’] = $post_data->comment_status;  
  32.   $data[‘ping_status’] = $post_data->ping_status;  
  33.   $data[‘post_password’] = $post_data->post_password;  
  34.   $data[‘post_name’] = $post_data->post_name;  
  35.   $data[‘to_ping’] = $post_data->to_ping;  
  36.   $data[‘pinged’] = $post_data->pinged;  
  37.   $data[‘post_modified’] = $post_data->post_modified;  
  38.   $data[‘post_modified_gmt’] = $post_data->post_modified_gmt;  
  39.   $data[‘post_content_filtered’] = $post_data->post_content_filtered;  
  40.   $data[‘post_parent’] = $post_data->post_parent;  
  41.   $data[‘guid’] = $post_data->guid;  
  42.   $data[‘post_type’] = $post_data->post_type;  
  43.   $data[‘menu_order’] = $post_data->menu_order;  
  44.   $data[‘post_mime_type’] = $post_data->post_mime_type;  
  45.   $data[‘comment_count’] = $post_data->comment_count;  
  46.   $data[‘ancestors’] = $post_data->ancestors;  
  47.   $data[‘filter’] = $post_data->filter;  
  48.       
  49.       
  50.     //下面的URL就是我们要备份的数据库B的地址了。这里要注意index.php?有个参数backupdb,这是我设置的一个简单的密钥,用来匹配A、B两个应用。后面详解  
  51.   $url = “http://1.jdzw.sinaapp.com/index.php?backupdb=1”;  
  52.       
  53.       
  54.   $ch = curl_init(); //初始化curl  
  55.   curl_setopt($ch, CURLOPT_POST, 1);//告诉curl要使用post传值  
  56.   curl_setopt($ch, CURLOPT_URL, $url);//告诉curl对应的url地址是$URL  
  57.   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//告诉curl要传过去的数据是$data  
  58.   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //告诉curl只要传值过去就行了,不用把结果显示出来。    
  59.   curl_exec($ch);//execute  
  60. }  
  61. //add_action是wp的一个亮点,这里简单解释里面两个参数一个是触发时间,一个是执行函数,那么这个函数就易懂了,当发布新文章的时候,执行backupdb这个函数,  
  62. add_action( ‘publish_post’, ‘backupdb’ );  

发送数据搞定了,那就要搞定接收数据了,下面是我B应用中的代码,直接在wordpress/index.php最后加上这一段就好了
PHP代码

  1. //直接在index.php里面加上下面这一段就好了  
  2. if(isset($_GET[‘backupdb’]))  
  3. {  
  4.   $data = $_POST;  
  5.   $sql = “INSERT INTO wp_posts(id,post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status,comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified,post_modified_gmt,post_content_filtered,post_parent,guid,post_type,menu_order,post_mime_type,comment_count) VALUES(“.$data[‘id’].“,”.$data[‘post_author’].“,'”.$data[‘post_date’].“‘,'”.$data[‘post_date_gmt’].“‘,'”.$data[‘post_content’].“‘,'”.$data[‘post_title’].“‘,'”.$data[‘post_excerpt’].“‘,'”.$data[‘post_status’].“‘,'”.$data[‘comment_status’].“‘,'”.$data[‘ping_status’].“‘,'”.$data[‘post_password’].“‘,'”.$data[‘post_name’].“‘,'”.$data[‘to_ping’].“‘,'”.$data[‘pinged’].“‘,'”.$data[‘post_modified’].“‘,'”.$data[‘ost_modified_gmt’].“‘,'”.$data[‘post_content_filtered’].“‘,'”.$data[‘post_patent’].“‘,'”.$data[‘guid’].“‘,'”.$data[‘post_type’].“‘,'”.$data[‘menu_order’].“‘,'”.$data[‘post_mime_type’].“‘,'”.$data[‘comment_count’].“‘)”;  
  6.   $wpdb->query($sql);  
  7.     
  8. }  

上面的代码大家应该显而易懂,我稍稍说一下那个密钥和add_action

1、密钥是用来匹配A和B这个应用的,如果没有这个密钥,那当任何人访问B应用的index.php的时候,都会执行后面的插入数据库的这段代码,当然,别人访问的是,是没有post的这个数据库,肯定会出错。
这个密钥是很简单的一种方法,但是不建议大家在index.php里面加入,因为index.php访问次数肯定多,每一次访问都会加上一个判断,这是影响性能的,我们可以新建一个php文件,去专门用来做备份。
密钥的方法不仅限于GET的方法,我们也可以在POST中再加入一个参数用来判断,再牛叉一点,用RC4加解密,再牛叉一点。。。。自己想吧,本码畜智商只到这里,一直都认为,代码的乐趣在于解决自己的需要,也在于自己摸索一些没玩过的东西。

2、add_action是wp中一个非常有意思的地方,它常用在我们写插件的时候,前面说了,第一个参数是触发事件,第二个参数是执行函数,想一下如果我们写的是add_action(“edit_post”,”backupdb”)、add_action(“delete_post”,”backupdb”)会发生什么呢?

在A应用后台中选择启用backupdb这个插件,
wordpress中自动同步数据库 - 第2张  | 最后的面包

然后在A应用中,发布新的文章,就会触发add_action(“publish_post”,”backupdb”),然后backupdb这个函数就会取得最后一条post数据,再将这条数据发送到B应用中,B应用匹配密钥是不是backupdb,如果密钥验证成功,就将$_POST中的数据,插入到B中的数据库。over
下面看我的:
wordpress中自动同步数据库 - 第3张  | 最后的面包

完成!
代码这个东西大同小异,在这里我是用SAE中的应用作为我的备份服务器,因为之前有把域名指向sae,但后来因为域名没有备案,sae只提供海外服务器,家里网络的原因,有时候打开sae有点慢,所以就没指向sae了,现在能够同步重要数据,随时将域名指向sae,就能继续使用了,再也不怕找到攻击拉。哈哈。

最后编辑:
作者:漱石
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

留下一个回复