【发布时间】:2012-10-01 07:44:12
【问题描述】:
所以我有一个格式为的平面文件数据库 用户名:$SHA$1010101010101010$010110010101010010101010100101010101001010:255.255.255.255:1342078265214
新行上的每条记录......大约 5000 多行......我想将它导入到 mysql 表中。通常我会使用 phpmyadmin 和“文件导入”来执行此操作,但现在我想通过使用 php 通过 ftp 下载数据库然后清理现有表数据并上传更新的数据库来自动化此过程。
id(AUTH INCREMENT) | username | password | ip | lastlogin
我在下面得到的脚本大部分都可以工作.. 虽然 php 会产生一个错误: “PHP致命错误:超过30秒的最大执行时间”我相信我可以增加这个时间,但在远程服务器上我怀疑我会被允许,所以我需要找到更好的方法。
在超时之前只有大约 1000 条记录会被插入到数据库中......
我正在使用的代码如下.. 我会说现在我不是 php 的专业人士,这主要是收集和拼凑在一起的。我正在寻求一些帮助以提高效率,因为我听说做这样的插入很糟糕。听起来真的很糟糕,因为当我在本地电脑上运行这个脚本时会刮很多磁盘。我的意思是为什么它要杀死硬盘来完成这样一个看似简单的任务。
<?php
require ('Connections/local.php');
$wx = array_map('trim',file("auths.db"));
$username = array();
$password = array();
$ip = array();
$lastlogin = array();
foreach($wx as $i => $line) {
$tmp = array_filter(explode(':',$line));
$username[$i] = $tmp[0];
$password[$i] = $tmp[1];
$ip[$i] = $tmp[2];
$lastlogin[$i] = $tmp[3];
mysql_query("INSERT INTO authdb (username,password,ip,lastlogin) VALUES('$username[$i]', '$password[$i]', '$ip[$i]', '$lastlogin[$i]') ") or die(mysql_error());
}
?>
【问题讨论】:
-
在一个查询中插入多行应该会显着提高性能。
-
由于您使用
mysql_query而不使用 proper SQL escaping,为了您自己的安全,您可能应该使用mysqli或 PDO。 -
我建议切换到使用fgets,而不是将整个文件拆分为一个数组,这也会提高速度。
-
我会考虑使用 fgets,尽管我认为我目前真正遇到的问题是以 php 不会提前超时的方式将其放入 mysql db。
-
@alfasin - 我假设你的母语不是英语。 aswel --> as well,(或“also”,或“additionally”)——这是一个拼写错误。 :)