浅析用PHP实现同步远程Mysql
浅析用PHP实现同步远程Mysql
需求:由于公司的英文网站放置在美国,而这些网站的数据要与大陆的服务器数据同步。同步时间在一天之内。
拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了平时使用的CSV文件批量录入数据。于是尝试使用CSV导入导出。
导入到处框架如下:
1首先将数据导出成CSV的格式。
建立一文件,放置在中国服务器上:csv.php.其实就是一个导出函数,通过数据库,表名和SQL语句来获得数据。
<?php
/**
*输出一个数据库中的表到一个CSV文件中
*
*@paramstringMysql数据库的主机
*@paramstring数据库名称
*@paramstring数据库中的表名
*@paramstring数据库的连接用户名
*@paramstring数据库的连接密码
*@paramstring数据库的表名
*@paramstring数据库的
*@paramstring错误页面
*@paramstringSQL语句
*
*@returntext返回CSV格式的内容
*
*@accesspublic
*/
functionPMA_exportData(host,db,user,pass,filename,table,crlf,error_url,sql_query){
what="csv";
csv_terminated="";
csv_separator=",";
csv_enclosed="";
csv_escaped=" ";
mysql_connect(host,user,pass)ordie("不能连接数据库,错误代码如下:".mysql_error());
mysql_select_db(db);
result=mysql_query(sql_query);
fields_cnt=mysql_num_fields(result);
cc="";
//fp=fopen(filename,'w');
//格式化数据
while(row=mysql_fetch_row(result)){
schema_insert='';
for(j=0;j<fields_cnt;j++){
if(!isset(row[j])||is_null(row[j])){
schema_insert.="NULL";//用什么来替换空值
}elseif(row[j]=='0'||row[j]!=''){
//loic1:用引号包含字段值
if(csv_enclosed==''){
schema_insert.=row[j];
}else{
schema_insert.=csv_enclosed
.str_replace(csv_enclosed,csv_escaped.csv_enclosed,row[j])
.csv_enclosed;
}
}else{
schema_insert.='';
}
if(j<fields_cnt-1){
schema_insert.=csv_separator;
}
}//endfor
//fwrite(fp,schema_insert.csv_terminated);
cc.=schema_insert.csv_terminated;
}//endwhile
mysql_free_result(result);
//fclose(fp);
returncc;
}
?>
2.将CSV格式的内容导入到表中
在美国服务器上建立个导入的文件,放置:import.php,代码如下:
<?php
/**
*从一个上传的文件中将数据导入到一个表中
*
*@paramstringMysql数据库的主机
*@paramstring数据库名称
*@paramstring数据库中的表名
*@paramstring数据库的连接用户名
*@paramstring数据库的连接密码
*@paramstring数据库的表名
*
*@returnbool是否执行成功
*
*@accesspublic
*/
functionuploadFileOfCsv(host,db,user,pass,table,content){
mysql_connect(host,user,pass)ordie("不能连接数据库,错误代码如下:".mysql_error());
mysql_select_db(db);
result=mysql_query("select*fromtable");
fields_cnt=mysql_num_fields(result);
test2=array(array());
rownum=0;
log("提取的数据如下:<br>".content);
fd1=fopen("C:test.csv",'a');
fwrite(fd1,content);
fclose(fd1);
fp=fopen("C:test.csv","r");
while(buffer=fgets(fp,4096))
{
i++;
tmp_arr=explode(",",buffer);
if(trim(tmp_arr[0])==""){
echo"<scriptlanguage='javascript'>";
echo"alert('第".i."行的ID空,请检查!');";
echo"location.href=document.referrer;";
echo"</script>";
exit;
}
query="INSERTINTOdb.table";
query.="values(";
for(q=0;q<fields_cnt;q++){
if(q==fields_cnt-1){
tmp=tmp_arr[q];
query.="'tmp');";
}else{
tmp=tmp_arr[q];
query.="'tmp',";
}
}//endfor(q=0;
log2(query);
mysql_query(query);
}
fclose(fp);
return"OK";
unlink("C:test.csv");
}
functionlog2(event=null){
//globaldb;
//globallogin;
if(LOG_ENABLED){
now=date("Y-M-dH:i:s");
fd=fopen("C:log.html",'a');
log=now.""._SERVER["REMOTE_ADDR"]."-event<br>";
fwrite(fd,log);
fclose(fd);
}
}
?>
3调用函数执行导出
在中国服务器上再建立一个文件:test_export.php,调用前面的csv.php的函数,然后将数据转成CSV,然后临时存到一个表单的textera中,注意表单提交的位置:
<?php
require_once("csv.php");
host="localhost";
db="project";
user="root";
pass="";
//导出tb_contact表的数据为csv文件
filename='file4.csv';
cc=PMA_exportData(host,db,user,pass,filename,"tb_project_dvp","","test.php","select*fromtb_project_dvp");
handle=fopen(filename,"rb");
contents=fread(handle,filesize(filename));
fclose(handle);
?>
<formname="form1"method="post"action="http://美国网站的地址/test2.php">
<p>
<textareaname="textarea"cols="180"rows="30"><?phpechocc?></textarea>
<inputtype="hidden"name="action"value="1"/>
</p>
<p>
<inputtype="submit"name="Submit"value="提交">
</p>
</form>
再在美国服务器上防置如下文件用于接受上传上来的数据,文件名为test_import.php:
<?php
require_once("csv.php");
require_once("import.php");
host="localhost";
db="wintopweb";
user="root";
pass="";
if(_POST['action']=="1"){
content=_POST['textarea'];
echouploadFileOfCsv(host,db,user,pass,"tb_project_dvp",content);
}
?>
最后利用Windows-xp/nt/03控制面版中自带任务计划,调度执行中国服务器test_export.php文件即可。