看到了另一种同步文章的方法 转过来记录一下 有空试试

【转】前些天我的博客“井底之蛙”所在的服务器召攻击了,丢失了一部分数据,这就怪自己没坚持放在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代码
/*
*@backage backupdb
* @version 1.6
*/
/*
Plugin Name: backupdb//这里是插件名称
Plugin URI: http://aoxiang.me//这里是插件链接的地址,这里链接的是我的博客,井底之蛙
Description: when you publish a new post, this plugin will backed up data to anthor database that you set ;//这里是你插件的简介
Author: Luffy//author
Version: 1.0//版本
Author URI: http://aoxiang.me
*/
/*
Plugin Name、Plugin URI、Description、Author、Version等等这几项建议大家都写上,不写有时候wp会不识别插件
*/
//函数中传入的是发表的新文章,写入A数据库以后,生成的post_id
function backupdb($post_id)
{
//下面我们通过这个postid,取得A数据库中的这条数据
$post_data = get_post($post_id);
//由于wp中取得的数据是对象(-_-###PHP居然是个有对象的语言,为毛我等码畜无对象!!!)的形式,我习惯了用数组的形式去处理数据,所以这里我把它全部改成了数组。
$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就是我们要备份的数据库B的地址了。这里要注意index.php?有个参数backupdb,这是我设置的一个简单的密钥,用来匹配A、B两个应用。后面详解
$url = "http://1.jdzw.sinaapp.com/index.php?backupdb=1";
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_POST, 1);//告诉curl要使用post传值
curl_setopt($ch, CURLOPT_URL, $url);//告诉curl对应的url地址是$URL
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//告诉curl要传过去的数据是$data
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //告诉curl只要传值过去就行了,不用把结果显示出来。
curl_exec($ch);//execute
}
//add_action是wp的一个亮点,这里简单解释里面两个参数一个是触发时间,一个是执行函数,那么这个函数就易懂了,当发布新文章的时候,执行backupdb这个函数,
add_action( 'publish_post', 'backupdb' );

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

//直接在index.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,就能继续使用了,再也不怕找到攻击拉。哈哈。

内容投诉
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论
'); })();