web-dev-qa-db-ja.com

プラグインのインストール中に大量のデータをカスタムテーブルに挿入する

私はデータベースにいくつかの新しいテーブルを作成するWordPressプラグインに取り組んでいます。また、CSVファイルからいくつかのデフォルトデータをテーブルにロードします。これらのほとんどは小さく、データのロードはうまく機能します。しかし、その1つは、わずか43,000行を超えるデータをロードするためのZipコードデータベースです。

挿入するデータ量が大幅に少ないテーブルに対して行ったこととまったく同じことを最初に試みました。 WordPressは「プラグインを使用すると致命的なエラーが発生したため、アクティブ化できませんでした」と回答しました。データベースを確認したところ、停止する前に1,000件を超える郵便番号を処理していました。それで私はそのCSVから最初の1500行を取り出し、それを2つのCSVファイル(それぞれ750行)に分けました。以下のコードを使用して、2つのCSVファイルをロードしてこれを実行できるかどうかをテストし、信じられないほど遅い解決策になるかどうかを調べましたが、少なくともうまくいきました。それが止まる前にそれがまだ1099の郵便番号を通過することができるだけであることがわかった。

WordPressプラグインから大量のデータをテーブルに挿入するための解決策はありますか?ここで私を助けようとしている人に前もって感謝します。

これは、zips CSVからの行の例です。

%1%;%00544%;%NY%;%HOLTSVILLE%;%-73.047623%;%40.813296%;%0%

これがテーブル作成関数です。

function Zip_table_create() {

global $wpdb;
$table_name = $wpdb->prefix . "Zip";

$sql = "CREATE TABLE $table_name (
     `Zip_id` bigint(20) NOT NULL AUTO_INCREMENT,
     `Zip` char(5) DEFAULT NULL,
     `state` char(2) NOT NULL DEFAULT '',
     `name` char(40) DEFAULT NULL,
     `lng` double NOT NULL DEFAULT '0',
     `lat` double NOT NULL DEFAULT '0',
     `population` int(10) unsigned NOT NULL DEFAULT '0',
     PRIMARY KEY (`Zip_id`)
     );";

dbDelta($sql);

// Check to see if any records are stored in table
// If not, load default data from CSV
$Zip = $wpdb->get_row("SELECT * FROM $table_name WHERE Zip_id = 1");
if ($Zip == null) {
    for ($z=1; $z<3; $z++)
    {
        $csvpath = plugin_dir_path(__FILE__);
        $csvpath = $csvpath."csv/zips".$z.".csv";

        $csv_array = csv2array($csvpath, ";", "%");

        for ($x=0; $x < count($csv_array); $x++) {
            $wpdb->insert( 
                $table_name, 
                array(  
                    'Zip_id' => $csv_array[$x][0],
                    'Zip' => $csv_array[$x][1],
                    'state' => $csv_array[$x][2],
                    'name' => $csv_array[$x][3],
                    'lng' => $csv_array[$x][4],
                    'lat' => $csv_array[$x][5],
                    'population' => $csv_array[$x][6]
                )
            );
        }
    }
}

}

これは、create関数で呼び出されたcsv2array関数です。

function csv2array($file, $delimiter, $Enclosure) {
if (($handle = fopen($file, "r")) !== FALSE) { 
    $i = 0; 
    while (($lineArray = fgetcsv($handle, 4000, $delimiter, $Enclosure)) !== FALSE) { 
        for ($j=0; $j<count($lineArray); $j++) { 
        $data2DArray[$i][$j] = $lineArray[$j]; 
        } 
        $i++; 
    } 
    fclose($handle); 
} 
return $data2DArray;
}
1
Brett Clapper

私はあなたにいくつかの提案があります:

  • 1、自分でMySQLの挿入クエリを作成します。
  • 2、複数のように、値(1,2,3)、(4,5,6)を挿入
  • 3、$wpdb->queryを使って

倍数」の適切な数は何かを把握する必要があります。

私は100で試してみました、そしてそれは私のために働きました、しかし、私は数がサーバー設定によって変わると思います。

2
Jesse

もう1つの提案は、スクリプト内のphp実行時間制限を延長することです。などを使用して:

set_time_limit($seconds);

$ secondsはスクリプトの実行時間です。

1
Dominic Yun