sync.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. require '../vendor/autoloader.php';
  3. require_once '../redis/function.php';
  4. $server = $_GET["server"];
  5. $localhost = $_GET["localhost"];
  6. $path=$_GET["path"];
  7. $time=$_GET["time"];
  8. $size=$_GET["size"];
  9. $output=["message"=>"","time"=>0,"src_row"=>0];
  10. $message = "<h3>正在处理 {$path}</h3>";
  11. $redis=redis_connect();
  12. if($redis){
  13. $sync_key = $redis->hget("sync://key",$_COOKIE["userid"]);
  14. if($sync_key===FALSE){
  15. $message.= "客户端没有钥匙"."<br>";
  16. $output["message"]=$message;
  17. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  18. exit;
  19. }
  20. }
  21. else{
  22. $message.= "redis连接失败"."<br>";
  23. $output["message"]=$message;
  24. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  25. exit;
  26. }
  27. $client = new \GuzzleHttp\Client();
  28. if($size<0){
  29. $response = $client->request('POST', $server.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'sync_count','time'=>$time,'size'=>$size,"key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  30. $serverJson=(string)$response->getBody();
  31. $serverData = json_decode($serverJson,true);
  32. echo json_encode($serverData, JSON_UNESCAPED_UNICODE);
  33. exit;
  34. }
  35. $response = $client->request('POST', $server.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'sync','time'=>$time,'size'=>$size,"key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  36. $serverJson=(string)$response->getBody();
  37. $serverData = json_decode($serverJson,true);
  38. if($serverData===NULL){
  39. $message.="无法解码 数据:".$serverJson;
  40. $output["message"]=$message;
  41. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  42. exit;
  43. }
  44. if($serverData["error"]>0){
  45. $message.=$serverData["message"];
  46. $output["message"]=$message;
  47. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  48. exit;
  49. }
  50. $message .= "<div>";
  51. $serverDBData = $serverData["data"];
  52. $output["src_row"]=count($serverDBData);
  53. $message.= "输入时间:".$time." | ";
  54. $message.= "src_row:".$output["src_row"]." | ";
  55. if($output["src_row"]>0){
  56. $output["time"]=$serverDBData[$output["src_row"]-1]["receive_time"];
  57. $message.= "最新时间:".$output["time"]." | ";
  58. }
  59. else{
  60. $message .= "没有查询到数据</div>";
  61. $output["message"]=$message;
  62. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  63. exit;
  64. }
  65. $aIdList=array();
  66. foreach($serverDBData as $sd){
  67. $aIdList[]=$sd["sync_id"];
  68. }
  69. $sIdlist = json_encode($aIdList, JSON_UNESCAPED_UNICODE);
  70. // 拉 id 列表
  71. $response = $client->request('POST', $localhost.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'sync','id'=>$sIdlist,'size'=>$size,"key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  72. $strLocalData = (string)$response->getBody();
  73. $localData = json_decode($strLocalData,true);
  74. if($localData["error"]>0){
  75. $message .="client 拉 id 列表 error:". $localData["message"];
  76. $output["message"]=$message;
  77. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  78. exit;
  79. }
  80. $localDBData = $localData["data"];
  81. $localCount = count($localDBData);
  82. $message .= "local-row:".$localCount." | ";
  83. $message .= "</div>";
  84. $localindex=array();
  85. $insert_to_server=array();
  86. $update_to_server=array();
  87. $insert_to_local=array();
  88. $update_to_local=array();
  89. #开始比对数据
  90. foreach($localDBData as $local){
  91. $localindex[$local["sync_id"]][0]=$local["modify_time"];
  92. $localindex[$local["sync_id"]][1]=false;
  93. }
  94. foreach($serverDBData as $sd){
  95. if(isset($localindex[$sd["sync_id"]])){
  96. $localindex[$sd["sync_id"]][1]=true;
  97. if($sd['modify_time']>$localindex[$sd["sync_id"]][0]){
  98. //服务器数据较新 server data is new than local
  99. $update_to_local[]=$sd["guid"];
  100. }
  101. else if($sd['modify_time']==$localindex[$sd["sync_id"]][0]){
  102. //"相同 same
  103. }
  104. else{
  105. //"服务器数据较旧 local data is new than server
  106. //$update_to_server[]=$sd->guid;
  107. }
  108. }
  109. else{
  110. //本地没有 新增 insert recorder in local
  111. $insert_to_local[]=$sd['guid'];
  112. }
  113. }
  114. foreach($localindex as $x=>$x_value){
  115. if($x_value[1]==false){
  116. //服务器新增 new data in server;
  117. //$insert_to_server[]=$x;
  118. }
  119. }
  120. $syncCount = count($insert_to_server)+count($update_to_server)+count($insert_to_local)+count($update_to_local);
  121. if($syncCount==0){
  122. $message .= "与服务器数据完全一致,无需更新。<br>";
  123. }
  124. else{
  125. //start sync
  126. $message .= "<div>";
  127. if(count($insert_to_local)>0){
  128. $message .= "需要新增到目标机".count($insert_to_local)."条记录 | ";
  129. #提取数据
  130. $idInServer = json_encode($insert_to_local, JSON_UNESCAPED_UNICODE);
  131. $response = $client->request('POST', $server.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'get','id'=>"{$idInServer}","key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  132. $serverData=(string)$response->getBody();
  133. $arrData = json_decode($serverData,true);
  134. if($arrData["error"]==0){
  135. $message .= "数据提取成功:{$arrData["message"]} | ";
  136. $strData = json_encode($arrData["data"], JSON_UNESCAPED_UNICODE);
  137. $response = $client->request('POST', $localhost.'/app/'.$path, ['verify' => false,'form_params'=>['op'=>'insert','data'=>"{$strData}","key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  138. $insertMsg = (string)$response->getBody();
  139. $arrInsertMsg = json_decode($insertMsg,true);
  140. $message .= $arrInsertMsg["message"] . " | ";
  141. }
  142. else{
  143. $message .= "数据提取错误 错误信息:{$arrData["message"]} ";
  144. }
  145. }
  146. $message .= "</div>";
  147. $message .= "<div>";
  148. if(count($update_to_local)>0){
  149. $message .= "需要更新到目标机".count($update_to_local)."条记录 | ";
  150. $idInServer = json_encode($update_to_local, JSON_UNESCAPED_UNICODE);
  151. $response = $client->request('POST', $server.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'get','id'=>"{$idInServer}","key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  152. $serverData=(string)$response->getBody();
  153. $arrData = json_decode($serverData,true);
  154. if($arrData["error"]==0){
  155. $message .= "数据提取成功:{$arrData["message"]} | ";
  156. $strData = json_encode($arrData["data"], JSON_UNESCAPED_UNICODE);
  157. $response = $client->request('POST', $localhost.'/app/'.$path,['verify' => false,'form_params'=>['op'=>'update','data'=>"{$strData}","key"=>$sync_key,"userid"=>$_COOKIE["userid"]]]);
  158. $strMsgUpdate = (string)$response->getBody();
  159. $arrMsgUpdate = json_decode($strMsgUpdate,true);
  160. $message .= $arrMsgUpdate["message"] . " | ";;
  161. }
  162. else{
  163. $message .= "数据提取错误 错误信息:{$arrData["message"]} ";
  164. }
  165. }
  166. $message .= "</div>";
  167. }
  168. $output["message"]=$message;
  169. echo json_encode($output, JSON_UNESCAPED_UNICODE);
  170. ?>