1. 云栖社区>
  2. PHP教程>
  3. 正文

php快速插入大批量数据到Sqlite3

作者:用户 来源:互联网 时间:2017-12-01 16:42:01

数据大批量

php快速插入大批量数据到Sqlite3 - 摘要: 本文讲的是php快速插入大批量数据到Sqlite3, php快速插入大批量数据到Sqlite3,有需要的朋友可以参考下。 因为需要为一批不大不小的文件插入到数据库分析,为操作方便所以选择了php和Sqlite3。刚开始直接使用的SQLite3类插入数据,我的个天呀慢的要死,30秒只插

php快速插入大批量数据到Sqlite3,有需要的朋友可以参考下。


因为需要为一批不大不小的文件插入到数据库分析,为操作方便所以选择了php和Sqlite3。刚开始直接使用的SQLite3类插入数据,我的个天呀慢的要死,30秒只插入了300多条数据最后还提示php-cgi.exe超时了。后来查资料得知用事务提交的方式会比较快,经测试成功后写了一个php类贴出来,用MySQL数据库也可用类似的方式。

class MyDB extends PDO{	protected $transactionCounter = 0;	protected $lasterror = "";	function __construct($index = 0)	{		try{			if($index == 1){				parent::__construct('sqlite:'.dirname(__FILE__)."/data.db");			}			else{				parent::__construct('sqlite:'.dirname(__FILE__)."/tools.db");			}			$this->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);		}catch(PDOException $e){			$this->lasterror = $e->getMessage();		}	}		function query($sql)	{		$result = array();		try{			$sth = $this->prepare($sql);			if(!$sth){				$this->lasterror = "Incorrect statement";				return array();			}			$sth->execute();			$result = $sth->fetchAll();		}catch(PDOException $e){			$this->lasterror = $e->getMessage();		}catch(Exception $e){			$this->lasterror = $e->getMessage();		}		return $result;	}		function exec($sql)	{		$count = 0;		try{			$count = parent::exec($sql);		}catch(PDOException $e){			$count = 0;			$this->rollback();			$this->lasterror = $e->getMessage();		}		return $count;	}	function beginTransaction()	{		if(!$this->transactionCounter++){			return parent::beginTransaction();		}		return $this->transactionCounter >= 0;	}	function commit()	{		if(!--$this->transactionCounter){			return parent::commit();		}		return $this->transactionCounter >= 0;	}	function close()	{	}	function rollback()	{		if($this->transactionCounter >= 0)		{			$this->transactionCounter = 0;			return parent::rollBack();		}		$this->transactionCounter = 0;		return false;	}	function getLasterror()	{		return $this->lasterror;	}}

使用示例:

$db = new MyDB(1);$db->beginTransaction();$fs = fopen('c://xxx.txt','r');$change = 0;while(!feof($fs)){	$tmp = fgets($fs,1024 * 10);	//......	$sql = "insert into $newtable values(NULL,'xxx','yyyy')";	if(!$db->exec($sql))		echo $db->getLasterror()."<br>";	else		$change += 1;	if($change % 1000 >= 999)	{		$db->commit();		$db->beginTransaction();	}}$db->commit();fclose($fs);echo "add $change items<br>";

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据 大批量 ,以便于您获取更多的相关知识。