sync.php 5.9 KB

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