php批量同步流程

  1. 首先分页获取数据
  2. 创建临时表
  3. 批量添加数据
  4. 备份原表
  5. 删除原表
  6. 修改临时表表名改为原表

 

代码

  1 <?php
  2 
  3 class Stock{
  4 
  5     private $database = "stockdb";
  6     private $table = "s_stock";
  7     private $tmp_table = "s_stock_tmp";
  8     private $url;
  9     private $link;
 10     private $queryStr;
 11     private $lastInsId;
 12     private $num_rows;
 13 
 14     public function __construct(){
 15 
 16     }
 17 
 18     public function mysql_connect($dbConfig=array()){
 19         $this->link = new mysqli($dbConfig['host'],$dbConfig['user'],$dbConfig['pass'],$dbConfig['database'],$dbConfig['port']);
 20         if($this->link->connect_errno)
 21         {
 22             echo $this->link->connect_errno.' '.$this->link->connect_error;
 23         }
 24         $dbVersion = $this->link->server_version;
 25         if ($dbVersion >= "4.1") {
 26             // 设置数据库编码 需要mysql 4.1.0以上支持
 27             $this->link->query("SET NAMES '".$dbConfig['charset']."'");
 28         }
 29         //设置 sql_model
 30         if($dbVersion >'5.0.1'){
 31             $this->link->query("SET sql_mode=''");
 32         }
 33     
 34     }
 35 
 36     /**
 37      * 判断数据表是否存在
 38      * @param $table
 39      * @return bool
 40      */
 41     public function isDBExist($database,$table){
 42         $n = mysqli_query($this->link,"select * from information_schema.tables where TABLE_SCHEMA='". $database ."' and TABLE_NAME = '". $table."'");
 43         if($n->num_rows==1){
 44             return true;//存在
 45         }else{
 46             return false;//不存在
 47         }
 48     }
 49 
 50 
 51     /**
 52      * 执行sql
 53      * @param $table
 54      * @return bool
 55      */
 56     public function execute($str) {
 57         
 58         if ( !$this->link ) return false;
 59         $this->queryStr = $str;
 60         $result =   $this->link->query($str);
 61 
 62         if ( false === $result ) {
 63             return false;
 64         } else {
 65             $this->numRows = $this->link->affected_rows;
 66             $this->lastInsId = $this->link->insert_id;
 67             return array('numRows'=>$this->numRows, 'lastInsId'=>$this->lastInsId);
 68         }
 69     }
 70 
 71 
 72     /**
 73      * 获取13位时间戳
 74      * @return float
 75      */
 76     function getMillisecond(){
 77         list($t1, $t2) = explode(' ', microtime());
 78         return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
 79     }
 80 
 81 
 82     /**
 83      * 定义添加数据的方法
 84      * @param string $table 表名
 85      * @param string orarray $data [数据]
 86      * @return int 最新添加的id
 87      */
 88     function insertOne($table,$data){
 89         if(empty($table) || empty($data)){
 90             return false;
 91         }
 92         //遍历数组,得到每一个字段和字段的值
 93         $key_str='';
 94         $v_str='';
 95         foreach($data as $key=>$v){
 96             if(empty($v) && $v !== 0){
 97                 continue;
 98             }
 99             //$key的值是每一个字段s一个字段所对应的值
100             $key_str.=$key.',';
101             $v_str.="'$v',";
102         }
103         $key_str=trim($key_str,',');
104         $v_str=trim($v_str,',');
105         //判断数据是否为空
106         $sql="insert into $table ($key_str) values ($v_str)";
107         $result = $this->execute($sql);
108         //返回上一次增加操做产生ID值
109         if ( false === $result ) {
110             return false;
111         } else {
112             return $result;
113         }
114     }
115 
116     /**
117      * 定义添加多条数据的方法
118      * @param string $table 表名
119      * @param string orarray $data [数据]
120      * @return int 最新添加的id
121      */
122     function insertAll($table,$dataArr){
123         if(empty($table) || empty($dataArr)){
124             return false;
125         }
126 
127         $val_str = '';
128         foreach($dataArr as $v){
129             $one_val = '(';
130             foreach($v as $kk => $vv){
131                 $one_val .= "'{$vv}',";
132             }
133             $one_val = rtrim($one_val,',');
134             $one_val .= '),';
135             $val_str .= $one_val;
136         }
137         $val_str = rtrim($val_str,',');
138         $key = implode(",",array_keys($dataArr[0])); //获取key
139         $sql = "INSERT INTO ".$table." (".$key.")VALUE ".$val_str;
140         $result = $this->execute($sql);
141         //返回上一次增加操做产生ID值
142         if ( false === $result ) {
143         } else {
144             return $result;
145         }
146     }
147 
148 
149 
150 
151     /**
152      * 创建临时表
153      * @return mixed
154      */
155     function createTmpStock(){
156         $isTableName = $this->isDBExist($this->database,$this->tmp_table);
157         if($isTableName){
158             return true;
159         }else{
160             $sql = "CREATE TABLE ".$this->database.".`".$this->tmp_table."` (
161     `Id` int(11) NOT NULL AUTO_INCREMENT,
162     `companyId` int(11) DEFAULT NULL COMMENT '公司ID',
163     `webId` int(11) DEFAULT NULL,
164     `pid` int(11) DEFAULT NULL COMMENT '产品id',
165     `productCode` varchar(50) DEFAULT NULL COMMENT '产品编码',
166     `OEcode` varchar(50) DEFAULT NULL,
167     `OEcode1` varchar(50) DEFAULT NULL,
168     `productName` varchar(20) DEFAULT NULL COMMENT '产品名称',
169     `eName` varchar(255) DEFAULT NULL COMMENT '产品英文名',
170     `unit` varchar(10) DEFAULT NULL COMMENT '单位',
171     `specification` varchar(255) DEFAULT NULL COMMENT '规格',
172     `place` varchar(255) DEFAULT NULL COMMENT '产地',
173     `brand` varchar(50) DEFAULT NULL COMMENT '零件品牌',
174     `ppcode` varchar(255) DEFAULT NULL COMMENT '零件品牌厂家编码',
175     `model` varchar(255) DEFAULT NULL COMMENT '车型',
176     `modelAll` varchar(255) DEFAULT NULL COMMENT '所有适配车型',
177     `quality` varchar(20) DEFAULT NULL COMMENT '品质',
178     `num` int(11) DEFAULT NULL COMMENT '库存数量',
179     `retailPrice` double DEFAULT NULL COMMENT '零售价',
180     `ctime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
181     `utime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
182     PRIMARY KEY (`Id`),
183     UNIQUE KEY `CWP` (`webId`,`pid`) USING BTREE COMMENT '公司ID+网站所属ID+产品ID'
184     ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='库存表';";
185 
186             $ret =$this->execute($sql);
187             return $ret;
188 
189         }
190     }
191 
192 
193     /**
194      * 修改表名
195      * @return mixed
196      */
197     function saveTableName(){
198         $time = date("YmdHis");
199         $newTableName = $this->table."_".$time;
200         $sql = "ALTER TABLE ".$this->database.".`".$this->table."` RENAME TO ".$this->database.".`".$newTableName."`";
201         $newSql = "ALTER TABLE ".$this->database.".`".$this->tmp_table."` RENAME TO ".$this->database.".`".$this->table."`";
202         $this->execute($sql);
203         return $this->execute($newSql);
204 
205     }
206 
207 
208 
209 
210     /**
211      * 增量式批量同步数据
212      */
213     function pushStockAction(){
214         header('Content-type:text/html;charset=utf-8');
215         set_time_limit(0); //取消脚本执行延时上限
216         ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort
217         $beginTime = getMillisecond();
218         echo "开始时间:{$beginTime}\n";
219         $yxM = new YxstockapiModel();
220         $retArr = $yxM->requestYXApiAllkckeyStock();//生成key
221         $allkckey = $retArr["allkckey"]; # 获取所有库存的秘钥,有效期2小时
222         $pcount = $retArr["pcount"]; # 库存总批数,通过pcount知道获取所有库存需要分多少批获取,从1至N
223         $dcount = $retArr["dcount"]; # 所有库存总条数
224 
225 
226         //根据批次获取数据
227         $num = 0;
228         for($i=1; $i< $pcount+1; $i++){
229             //开始同步的时候创建临时表,用以同步数据
230             if($i == 1){
231                 $yxM->createTmpStock();
232             }
233             $ret = $yxM->requestYXApiAllStock($allkckey,$i);//批量同步数据
234             $num += $ret["numRows"];
235     //            sleep(5);//睡眠5秒防止内存溢出
236 
237         }
238         if($num > 0){
239             //所有的循环结束之后在修改表名
240             $yxM->saveTableName();
241         }
242         
243         // 计算总耗时和同步数据条数
244         $endTime = getMillisecond();
245         $timeConsuming = $endTime - $beginTime;
246         echo "\n\n同步时间总耗时:{$timeConsuming}\n库存总条数:{$dcount}\n同步库存总条数:{$num}";
247 
248 
249     }
250 
251 
252 
253 }

简单的同步