近日(2012-12-3) 在进行(php+sqlite)数据库导出导入的时候,导入数据操作 报Fatal error: Maximum execution time of 30 seconds exceeded in *.php line * 的错误,而插入的数据不超过1000条,电脑配置也不差。
究其原因,在导入数据的时候,我没使用事务提交。导致插入几百条数据竟使用30秒以上。以下是更改后的代码!数据导入的方法来自:http://bbs.lampbrother.net/read-htm-tid-114482.html
<?php
set_time_limit(0); //0代表永不超时
$flag=true;
$pdo=new PDO(NBOX_DB);//连接数据库
$temp = $_FILES["file"]["tmp_name"];
$sql_stream = file_get_contents($temp);//读取整个文件内容
$sql_stream = rtrim($sql_stream);//去掉末尾空格
//利用正则替换函数,将导入的内容部分,即insert value里的;换成特殊符号' $$$ '为进一步按;切割单条sql语句做准备
$new_stream = preg_replace_callback("/\((.*)\)/", create_function('$matches', 'return str_replace(";"," $$$ ",$matches[0]);'), $sql_stream);
//切割单条sql语句生成数组
$sql_array = explode(";", $new_stream);
//遍历该数组
$pdo->beginTransaction();
foreach ($sql_array as $value) {
if (!empty($value)){ //数组最后一个是空数组,所以需要判断一下
$sql = str_replace(" $$$ ", ";", $value) . ";"; //将该条sql语句中' $$$ '转换回;
$count=$pdo->exec($sql); //执行该语句
if($count!=1){ //返回false if(!$pd0)
echo "\nPDO::errorInfo():\n";
print_r($pdo->errorInfo());
$pdo->rollBack();
$flag=false;
break;
}
}
}
if ($flag){
$pdo->commit();
echo "数据插入成功";
}
?>
导入数据超时除了以上代码优化,如果数据海量,那么可以重新设置超时时间,
方法1:设置php.ini下的max_execution_time = 30 将30改为0,表示永不超时
方法2:在程序代码中加入 set_time_limit(0); //0代表永不超时