php批量同步数据
php批量同步流程
- 首先分页获取数据
- 创建临时表
- 批量添加数据
- 备份原表
- 删除原表
- 修改临时表表名改为原表
代码

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 }
简单的同步
php批量同步数据的更多相关文章
- 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql
c#代码,批量导入数据代码 public class MySql_Target : ZFCommon.DataAccesser.Base.DABase { public MySql_Target() ...
- 批量插入数据(基于Mybatis的实现-Oracle)
前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...
- SQL Server 跨库同步数据
最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理.这里的存储过程用的不是op ...
- Hibernate批量处理数据、HQL连接查询
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 ...
- Hibernate批量处理数据、[HQL连接查询]
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...
- springboot jpa 批量保存数据--EntityManager和 JpaRepository
1: 项目里面使用springboo-boot-start-data-jpa操作数据库,通过源码,在repository上继承JpaRepository 可以实现保存操作,其中源码接口为: <S ...
- Hibernate三种批量处理数据
概念:批量处理数据是指在一个事务场景中处理大量数据. 在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 execute ...
- Hibernate 中批量处理数据
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 ...
- Elasticsearch 2.3.2 从oracle中同步数据
Elasticsearch 2.3.2 从oracle中同步数据 1 数据批量导入-oracle 采用 elasticsearch-jdbc 插件 安装.版本需要ES版本一致 最新 ...
- FreeSql (六)批量插入数据
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
随机推荐
- 2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起点开始出发,一次移动是指向四个基本方向之
2023-03-06:给定一个二维网格 grid ,其中: '.' 代表一个空房间 '#' 代表一堵 '@' 是起点 小写字母代表钥匙 大写字母代表锁 我们从起点开始出发,一次移动是指向四个基本方向之 ...
- 2022-07-26:以下go语言代码输出什么?A:5;B:hello;C:编译错误;D:运行错误。 package main import ( “fmt“ ) type integer in
2022-07-26:以下go语言代码输出什么?A:5:B:hello:C:编译错误:D:运行错误. package main import ( "fmt" ) type inte ...
- 2022-06-01:给定一个数组arr,可能有正、有负、有0,无序。 只能挑选两个数字,想尽量让两个数字加起来的绝对值尽量小。 返回可能的最小的值。
2022-06-01:给定一个数组arr,可能有正.有负.有0,无序. 只能挑选两个数字,想尽量让两个数字加起来的绝对值尽量小. 返回可能的最小的值. 答案2022-06-01: 排序,双指针. 代码 ...
- 2022-02-05:字典序的第K小数字。 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。 注意:1 ≤ k ≤ n ≤ 10**9。 示例 : 输入: n: 13 k: 2
2022-02-05:字典序的第K小数字. 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 10**9. 示例 : 输入: n: 13 k: 2 输出 ...
- 大幅提升前端工作效率!Numeral.js数值格式化库来了!
我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和 ...
- Vagrant 学习笔记:搭建 K8s 集群
Vagrant学习笔记:搭建K8s集群 通常情况下,我们在使用VMware.VirtualBox这一类虚拟机软件创建虚拟开发环境时,往往需要经历寻找并下载操作系统的安装镜像文件,然后根据该镜像文件启动 ...
- Vue——动态组件、插槽、Vue-cli创建项目、Vue项目目录结构、编写规范、es6导入导出语法
动态组件 // <component :is="who"></component> // component标签的is属性等于组件名字,这里就会显示这个组件 ...
- 5月这几个API安全漏洞值得注意!
5月份的一些API安全漏洞报告 希望大家查漏补缺 及时修复自己API可能出现的漏洞 No.1 微软.NET Core漏洞 漏洞详情:微软官方发布公告称,其.NET Core 2.1.3.1和5.0版本 ...
- 可能是最简单最通透的Comparable和Comparator接口返回值理解
先说 Comparator 接口,这个理解了,下一个就理解了 一.Comparator 的用法(暂不考虑0,因为0不处理) 返回-1,1交换不交换位置,如果撇开比较器的两个参数和jdk默认顺序来说,存 ...
- Rust 内存系统
第四章 内存系统 不同的编程语言对内存有着不同的管理方式. 按照内存的管理方式可将编程语言大致分为两类: 手动管理类 手动内存管理类需要开发者使用malloc和free等函数显式管理内存. 自动内存管 ...