1

所以我有一个用户名格式的平面文件数据库:$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()); 
}
?>
4

2 回答 2

4

试试这个,使用绑定参数和 PDO。

<?php
require ('Connections/local.php');

$wx = array_map('trim',file("auths.db"));
$username = array();
$password = array();
$ip = array();
$lastlogin = array();

try {
    $dbh = new PDO("mysql:host=$ip;dbname=$database", $dbUsername, $dbPassword);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

$mysql_query = "INSERT INTO authdb (username,password,ip,lastlogin) VALUES(:username, :password, :ip, :lastlogin)";
$statement = $dbh->prepare($mysql_query);

foreach($wx as $i => $line) {
        set_time_limit(0);

        $tmp = array_filter(explode(':',$line));
        $username[$i] = $tmp[0];
        $password[$i] = $tmp[1];
        $ip[$i] = $tmp[2];
        $lastlogin[$i] = $tmp[3];

        $params = array(":username"  => $username[$i],
                        ":password"  => $password[$i],
                        ":ip"        => $ip[$i],
                        ":lastlogin" => $lastlogin[$i]);
        $statement->execute($params);
}
?>
于 2012-10-10T18:50:50.543 回答
0

Instead of sending queries to server one by one in the form

insert into table (x,y,z) values (1,2,3)

You should use extended insert syntax, as in:

insert into table (x,y,z) values (1,2,3),(4,5,6),(7,8,9),...

This will increase insert performance by miles. However you need to be careful about how many rows you insert in one statement, since there is a limit to the size of a single SQL can be. So, I'd say start with 100 row packs and see how it goes, then adjust pack size accordingly. Chances are your insert time will go down to like 5 seconds, putting it way under max_execution_time limit.

于 2014-11-24T09:05:03.383 回答