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のプロではなく、これは主にまとめられ、一緒に石畳にされています。このような挿入を行うのは悪いことだと聞いているので、これをより効率的にするための助けを探しています。そして、ローカルPCでこのスクリプトを実行すると、多くのディスクスクラッチが発生するため、非常に悪い音に聞こえます。つまり、このような一見単​​純なタスクを実行するためにhddを強制終了する必要があるのはなぜですか。

<?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

フォームでサーバーにクエリを1つずつ送信する代わりに

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

次のように、拡張挿入構文を使用する必要があります。

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

これにより、インサートのパフォーマンスが数マイル向上します。ただし、1つのSQLのサイズには制限があるため、1つのステートメントに挿入する行数に注意する必要があります。したがって、100行パックから始めて、それがどのようになるかを確認し、それに応じてパックサイズを調整します。挿入時間が5秒程度に短縮され、max_execution_time制限を下回る可能性があります。

于 2014-11-24T09:05:03.383 に答える