前些天我的博客“井底之蛙”所在的服务器召攻击了,丢失了一部分数据,这就怪自己没坚持放在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应用中这样子:

下一步就是往里面敲代码了。
PHP代码
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- function backupdb($post_id)
- {
-
- $post_data = get_post($post_id);
-
-
- $data[‘id’] = $post_data->ID;
- $data[‘post_author’] = $post_data->post_author;
- $data[‘post_date’] = $post_data->post_date;
- $data[‘post_date_gmt’] = $post_data->post_date_gmt;
- $data[‘post_content’] = $post_data->post_content;
- $data[‘post_title’] = $post_data->post_title;
- $data[‘post_excerpt’] = $post_data->post_excerpt;
- $data[‘post_status’] = $post_data->post_status;
- $data[‘comment_status’] = $post_data->comment_status;
- $data[‘ping_status’] = $post_data->ping_status;
- $data[‘post_password’] = $post_data->post_password;
- $data[‘post_name’] = $post_data->post_name;
- $data[‘to_ping’] = $post_data->to_ping;
- $data[‘pinged’] = $post_data->pinged;
- $data[‘post_modified’] = $post_data->post_modified;
- $data[‘post_modified_gmt’] = $post_data->post_modified_gmt;
- $data[‘post_content_filtered’] = $post_data->post_content_filtered;
- $data[‘post_parent’] = $post_data->post_parent;
- $data[‘guid’] = $post_data->guid;
- $data[‘post_type’] = $post_data->post_type;
- $data[‘menu_order’] = $post_data->menu_order;
- $data[‘post_mime_type’] = $post_data->post_mime_type;
- $data[‘comment_count’] = $post_data->comment_count;
- $data[‘ancestors’] = $post_data->ancestors;
- $data[‘filter’] = $post_data->filter;
-
-
-
- $url = “http://1.jdzw.sinaapp.com/index.php?backupdb=1”;
-
-
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
- curl_exec($ch);
- }
-
- add_action( ‘publish_post’, ‘backupdb’ );
发送数据搞定了,那就要搞定接收数据了,下面是我B应用中的代码,直接在wordpress/index.php最后加上这一段就好了
PHP代码
-
- if(isset($_GET[‘backupdb’]))
- {
- $data = $_POST;
- $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’].“‘)”;
- $wpdb->query($sql);
-
- }
上面的代码大家应该显而易懂,我稍稍说一下那个密钥和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这个插件,

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

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