私はデータベースにいくつかの新しいテーブルを作成する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;
}
私はあなたにいくつかの提案があります:
$wpdb->query
を使って「倍数」の適切な数は何かを把握する必要があります。
私は100で試してみました、そしてそれは私のために働きました、しかし、私は数がサーバー設定によって変わると思います。
もう1つの提案は、スクリプト内のphp実行時間制限を延長することです。などを使用して:
set_time_limit($seconds);
$ secondsはスクリプトの実行時間です。