リアルタイム同期スクリプト
56071 ワード
この間、会社のプロジェクトの必要性のため、サービスサイトのファイルライブラリをリアルタイムで同期させる必要がありました.ディレクトリアーキテクチャと内容が含まれています.そこで、Linuxで実行するスクリプトを書きました.今、私が書いたスクリプトコードを貼ってください.
// exit;
set_time_limit(0);
$conn=new PDO("mysql:host=xxx;dbname=xxx;","root","xxx");
$conn->exec("SET NAMES 'utf8';");
function writeLog($msg){//
if(!$msg) return false;
$dir = '/data/www/default/temp/';
$log = 'updatelog';
$filesize = filesize($dir.'/'.$log);
if($filesize>3145728){// log 3mb
rename($dir.'/'.$log,$dir.'/'.$log."".date('YmdH',time()));
}
$result = file_put_contents($dir.'/'.$log,(date('Y-m-d h:i:s',time())).' '.$msg."\r
",FILE_APPEND);
return $result;
}
function get_transid(){// id
global $conn;
$result = $conn->query("select * from transid");
$row = $result->fetchAll(PDO::FETCH_ASSOC);
$row_n = array();
foreach ($row as $key => $value) {
$row_n[$value['oldid']] = $value['id'];
}
$row_n[''] = 0;
return $row_n;
}
function addnavigation($pid,$arr){// category navigation
global $conn;
if($pid!=0){
$result = $conn->query("select * from category where cid=".$pid);
$row = $result->fetch(PDO::FETCH_ASSOC);
$arr[] = array('cid'=>$row['cid'],'name'=>$row['name']);
$parentarr = addnavigation($row['pid'],$arr);
return $parentarr;
}else{
return $arr;
}
}
function writedata($dataArr,$flag=0,$table){//
global $conn;
if(!in_array($table,array('tempdir2','file_compare'))){
return "tablename is wrong!";
}
if($flag==0){//
$res = $conn->exec("truncate table ".$table);
$arr = $conn->query("select count(1) as flag from ".$table);
$row = $arr->fetch(PDO::FETCH_ASSOC);
$flag = $row['flag']==0?1:0;
writedata($dataArr,$flag,$table);
}else{
//
if($table=='tempdir2'){
$stmt = $conn->prepare("insert into tempdir2 (id,catalogName,parentId,catalogRoutingNumber) values (:id,:name,:pid,:cnum)");
foreach ($dataArr as $key => $value) {
$arr = array(
':name' => $value['catalogName'],
':cnum' => $value['catalogRoutingNumber'],
':id' => $value['id'],
':pid' => $value['parentId']
);
$result = $stmt->execute($arr);
}
}elseif($table=='file_compare'){
$stmt = $conn->prepare("insert into file_compare (oldid,CatalogId,title,uploadUserName,uploadDate,newUptime,summary,isvisiableForuser,isdeleted,url) values (:oldid,:pid,:title,:uploadUserName,:uploadDate,:newUptime,:summary,:isvisiable,:isdeleted,:url)");
$id_arr = get_transid();// id
foreach ($dataArr as $key => $value) {
$time = strtotime(substr($value['uploadDate'],0,strlen($value['uploadDate'])-2));
$newUptime = strtotime(substr($value['newVersionUploaddate'],0,strlen($value['newVersionUploaddate'])-2));
if(in_array($value['knowledgeCatalogId'],array_keys($id_arr))){
$pid = intval($id_arr[$value['knowledgeCatalogId']]);
}else{
$pid = 0;
}
$arr = array(
':oldid' => $value['id'],
':pid' => $pid,
':title' => $value['title'],
':uploadUserName' => $value['uploadUserName'],
':uploadDate' => $time,
':newUptime' => $newUptime,
':summary' => $value['summary'],
':isvisiable' => intval($value['isvisiableForuser']),
':isdeleted' => intval($value['isdeleted']),
':yxturl' => $value['knowledgeUrl']
);
$result = $stmt->execute($arr);
}
}
return 1;
}
}
echo date("Y-m-d H:i:s")." ———————————————— ";
writeLog("【***************** ********************】");
//**********************************************************************************
//
//
// CURL
function curl_post($url,$arr){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8"));//important
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arr));
$data=curl_exec($ch);
curl_close($ch);
return json_decode($data,true);
}
function curl_post_del($url,$arr){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
$data=curl_exec($ch);
curl_close($ch);
return json_decode($data,true);
}
function salt(){
$salt=rand(10000,99999);
return $salt;
}
$apikey="xxxxxxx";
$secretkey="xxxxxxx";
$salt1=salt();
$salt2=salt();
$signature1=hash('sha256',$secretkey.$salt1);
$signature2=hash('sha256',$secretkey.$salt2);
//
$url1='http://url';
$data1=array(
'apikey' => $apikey,
'salt' => $salt1,
'signature' => $signature1,
'kngCatalogId' => '',
'updateDate' => '',
'knowledgeTypes'=>''
);
$result1=curl_post($url1,$data1);
$new_filedata=$result1['data'];
//
$url2='http://url';
$data2=array(
'apikey' => $apikey,
'salt' => $salt2,
'signature' => $signature2
);
$result2=curl_post($url2,$data2);
$new_dirdata=$result2['data'];
//**********************************************************************************
//
//
writedata($new_dirdata,0,'tempdir2');
//
$compare_sql = "SELECT t2.* from tempdir2 t2 LEFT JOIN tempdir t1 ON t1.id=t2.id && t1.catalogName=t2.catalogName && t1.parentId=t2.parentId && t1.catalogRoutingNumber=t2.catalogRoutingNumber WHERE t1.sid is null";
$compareArr = $conn->query($compare_sql);
$compareRow = $compareArr->fetchAll(PDO::FETCH_ASSOC);
$category_add_arr = array();
$category_update_arr = array();
$navigation_row = array();
if(count($compareRow)>0){
writeLog("【 ".count($compareRow)." 】");
//
foreach ($compareRow as $key => $value) {
$id = $value['id'];
$catalogName = $value['catalogName'];
$parentId = $value['parentId'];
$catalogRoutingNumber = $value['catalogRoutingNumber'];
$result = $conn->query("select 1 from tempdir where id='".$id."'");
$row = $result->fetch(PDO::FETCH_ASSOC);
if(empty($row)){
$result_add = $conn->exec("insert into tempdir (id,catalogName,parentId,catalogRoutingNumber) values ('".$id."','".$catalogName."','".$parentId."','".$catalogRoutingNumber."')");//
$result_add2 = $conn->exec("insert into transid (oldid) values ('".$id."')");// ID ID cid
if($result_add>0 && $result_add2>0){
$value["newid"] = $conn->lastInsertId();
$category_add_arr[] = $value;
}else{
writeLog("【 】");
}
}else{
$result_update = $conn->exec("update tempdir set catalogName='".$catalogName."',parentId='".$parentId."',catalogRoutingNumber='".$catalogRoutingNumber."' where id='".$id."'");//
if($result_update>0){
$category_update_arr[] = $value;
}else{
writeLog("【 】");
}
}
}
//
$dirid_arr = get_transid();
//
if(!empty($category_add_arr)){//
writeLog("【 ".count($category_add_arr)." 】");
foreach ($category_add_arr as $key => $value) {
$pid = $dirid_arr[$value['parentId']];
$cid = $value['newid'];
$displayorder = $value['catalogRoutingNumber'];
$displayorder = substr($displayorder,strlen($displayorder)-3,strlen($displayorder));
$navigation_row[] = array('cid'=>$cid,'pid'=>$pid,'name'=>$catalogName,);
$result_add_c = $conn->exec("insert into category (cid,pid,name,displayorder,image,navigation,description) values ('".$cid."','".$pid."','".$catalogName."','".$displayorder."','','','')");
// echo "【 :".$result_add_c."】\r
";
}
}
if(!empty($category_update_arr)){//
writeLog("【 ".count($category_update_arr)." 】");
foreach ($category_update_arr as $key => $value) {
$pid = $dirid_arr[$value['parentId']];
$id = $dirid_arr[$value['id']];
$displayorder = $value['catalogRoutingNumber'];
$displayorder = substr($displayorder,strlen($displayorder)-3,strlen($displayorder));
$result_update_c = $conn->exec("update category set pid='".$pid."',name='".$value['catalogName']."',displayorder='".$displayorder."' where cid='".$id."'");
// echo "【 :".$result_update_c."】\r
";
}
}
foreach ($navigation_row as $key => $value) {// navigation
$arr = array();
if($value['pid']!=0){
$arr = addnavigation($value['cid'],$arr);
}else{
$arr[] = array('cid'=>$value['cid'],'name'=>$value['name']);
}
$navigation = addslashes(serialize($arr));
$conn->exec("update category set navigation='".$navigation."' WHERE cid=".$value['cid']);
}
}else{
writeLog("【 】");
}
//**********************************************************************************
//
//
$delcompare_sql = "SELECT t1.* from tempdir t1 LEFT JOIN tempdir2 t2 ON t1.id=t2.id WHERE t2.sid is null";
$delcompareArr = $conn->query($delcompare_sql);
$delcompareRow = $delcompareArr->fetchAll(PDO::FETCH_ASSOC);
if(count($delcompareRow)>0){
writeLog("【 ".count($delcompareRow)." 】");
foreach ($delcompareRow as $key => $value) {
$result_del_1 = $conn->exec("delete from tempdir where id='".$value['id']."'");
$result_delid = $conn->query("select * from transid where oldid='".$value['id']."'");// id
$row_delid = $result_delid->fetch(PDO::FETCH_ASSOC);
if(!empty($row_delid)){
$result_del_2 = $conn->exec("delete from transid where oldid='".$value['id']."'");
$result_del_3 = $conn->exec("delete from category where cid=".$row_delid['id']);
}
}
}
//
//**********************************************************************************
//
//
writedata($new_filedata,0,'file_compare');
//
$compare_sql = "SELECT t2.*,t1.lastedit as lastedit from file_compare t2 LEFT JOIN wiki_doc t1 ON t1.oldid=t2.oldid && t2.knowledgeCatalogId=t1.cid && t2.isdeleted=t1.isdeleted && t2.isvisiableForuser=t1.visible && t1.title=t2.title WHERE t1.did is null";
$compareArr = $conn->query($compare_sql);
$compareRow = $compareArr->fetchAll(PDO::FETCH_ASSOC);
if(count($compareRow)>0){
writeLog("【 ".count($compareRow)." 】");
//********************************************************************************************************
// ,
$delid_arr = array();
foreach ($compareRow as $key => $value) {
if($value['isdeleted']==1){
$delid_arr[] = "'".$value['oldid']."'";
}
}
if(!empty($delid_arr)){
$id_str = implode(",",$delid_arr);
$sel_del_sql = "SELECT oldid from doc WHERE isdeleted=0 and oldid in (".$id_str.")";//
$del_Arr = $conn->query($sel_del_sql);
$del_Row = $del_Arr->fetchAll(PDO::FETCH_ASSOC);
if(!empty($del_Row)){
$report_del_str = '';// ID
foreach ($del_Row as $key => $value) {
$report_del_str .= $value['oldid'].",";
}
$report_del_str = substr($report_del_str,0,strlen($report_del_str)-1);
$del_data=array('id' => $report_del_str);
$url_repdel = "url";
$post_del = curl_post_del($url_repdel,$del_data);//
writeLog("【 xxx ID, ".count($del_Row)." ,id=".$report_del_str.",".$post_del['reMsg']."】");
}
}
//********************************************************************************************************
//
$stmt_add = $conn->prepare("insert into doc (cid,title,summary,author,time,lastedit,lasteditor,visible,isdeleted,oldid) values (:cid,:title,:summary,:author,:time,:lastedit,:lasteditor,:visible,:isdeleted,:oldid)");// doc
$stmt_update = $conn->prepare("update doc set cid=:cid,title=:title,summary=:summary,lastedit=:lastedit,lasteditor=:lasteditor,visible=:visible,isdeleted=:isdeleted where oldid=:oldid");// doc
$stmt_down_url = $conn->prepare("insert into temp_downurl (oid,did,cid,time,filename) values (:oid,:did,:cid,:time,:filename)");
foreach ($compareRow as $key => $value) {
//
$result = $conn->query("select did from doc where oldid='".$value['oldid']."'");
$row = $result->fetch(PDO::FETCH_ASSOC);
if(empty($row)){
$arr = array(
':oldid' => $value['oldid'],
':cid' => intval($value['knowledgeCatalogId']),
':title' => $value['title'],
':summary' => $value['summary'],
':time' => intval($value['uploadDate']),
':lastedit' => intval($value['uploadDate']),
':author' => $value['uploadUserName'],
':lasteditor' => $value['uploadUserName'],
':isdeleted' => intval($value['isdeleted']),
':visible' => intval($value['isvisiableForuser'])
);
$result_add = $stmt_add->execute($arr);
if($result_add>0){
writeLog("【wiki_doc oldid=".$value['oldid']."】");
}else{
writeLog("【wiki_doc oldid=".$value['oldid']."】");
}
$did = $conn->lastInsertId();
//
$arr_url = array(
':oid' => $value['oldid'],
':did' => intval($did),
':cid' => intval($value['knowledgeCatalogId']),
':time' => intval($value['uploadDate']),
':filename' => $value['title']
);
$result_url = $stmt_down_url->execute($arr_url);
if($result_url>0){
writeLog("【 did=".$did."】");
}else{
writeLog("【 did=".$did."】");
}
}else{
$arr = array(
':oldid' => $value['oldid'],
':cid' => intval($value['knowledgeCatalogId']),
':title' => $value['title'],
':summary' => $value['summary'],
':lastedit' => intval($value['newUptime']),
':lasteditor' => $value['uploadUserName'],
':isdeleted' => intval($value['isdeleted']),
':visible' => intval($value['isvisiableForuser'])
);
$result_update = $stmt_update->execute($arr);
if($result_update>0){
writeLog("【wiki_doc oldid=".$value['oldid']."】");
}else{
writeLog("【wiki_doc oldid=".$value['oldid']."】");
}
if($value['lastedit']!==$value['newUptime']){//
//
$arr_url = array(
':oid' => $value['oldid'],
':did' => intval($row['did']),
':cid' => intval($value['knowledgeCatalogId']),
':time' => intval($value['newUptime']),
':filename' => $value['title']
);
$result_url = $stmt_down_url->execute($arr_url);
if($result_url>0){
writeLog("【 did=".$row['did']."】");
}else{
writeLog("【 did=".$row['did']."】");
}
}
}
}
}else{
writeLog("【 】");
}
// link doc
$compare_sql_link = "SELECT t2.did,t2.cid from doc t2 LEFT JOIN categorylink t1 ON t1.did=t2.did && t2.cid=t1.cid WHERE t1.did is null";
$compareArr_link = $conn->query($compare_sql_link);
$compareRow_link= $compareArr_link->fetchAll(PDO::FETCH_ASSOC);
if(count($compareRow_link)>0){
$stmt_add_link = $conn->prepare("insert into categorylink (did,cid) values (:did,:cid)");// link
$stmt_update_link = $conn->prepare("update categorylink set cid=:cid where did=:did");// link
foreach ($compareRow_link as $key => $value) {
$result = $conn->query("select 1 from categorylink where did='".$value['did']."'");
$row = $result->fetch(PDO::FETCH_ASSOC);
if(empty($row)){
$arr_link = array(
':did' => intval($value['did']),
':cid' => intval($value['cid'])
);
$result_add_link = $stmt_add_link->execute($arr_link);
if($result_add_link>0){
writeLog("【 link did=".$value['did']."】");
}else{
writeLog("【 link did=".$value['did']."】");
}
}else{
$arr_link = array(
':did' => intval($value['did']),
':cid' => intval($value['cid'])
);
$result_update_link = $stmt_update_link->execute($arr_link);
if($result_update_link>0){
writeLog("【 link did=".$value['did']."】");
}else{
writeLog("【 link did=".$value['did']."】");
}
}
}
}
writeLog("【********************** *************************】");
echo date("Y-m-d H:i:s")." \r
";
?>