Каждые три месяца мне необходимо загружать CSV-файл, содержащий около 400 000 продуктов, и вставлять их в базу данных MySQL.Я не чувствую, что мой метод очень эффективен и хотел бы получить некоторые предложения.
В настоящее время я анализирую файл CSV следующим образом:
public function parse_csv_to_array() {
// Initialize empty array
$array = $fields = array();
$interval = 0;
// File Handle
$handle = @fopen($this->csvFile, "r");
if ($handle) {
while (($row = fgetcsv($handle, 4096)) !== false) {
if (empty($fields)) {
$fields = $row;
continue;
}
foreach ($row as $k=>$value) {
$array[$interval][$fields[$k]] = $value;
}
$interval++;
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
return $array;
}
Затем я просто перебираю массив, вставляя новыйили замена существующей записи, если она уже присутствует.Это означает, что я выполняю не менее 1,2 миллиона запросов SQL, чтобы сначала проверить, присутствует ли запись, а затем вставить / заменить запись в базе данных.
В настоящее время это выполняется в виде загрузки формы HTML5 и выполняется пользователями.браузер, как только они нажимают кнопку отправить.Весь процесс может занять до 30 минут, что я не считаю плохим, но мне пришлось установить неограниченное время ожидания PHP-скрипта, чтобы скрипт мог работать.Я не чувствую, что это очень эффективно и значительно увеличивает нагрузку на сервер.Мне было интересно, если есть методы сегментации массива и загрузки записей в разделах или я должен использовать планировщики, такие как CRON.Идея просто выполнить 1,2 миллиона SQL-запросов в одном скрипте кажется грязной, и должен быть лучший способ.Любые предложения приветствуются.