@sllugovskih

Импорт больших прайсов в БД MySQL?

Привет всем. Делаю интернет-магазин на фреймворке CodeIgniter. Возник вопрос импорта крупных CSV прайсов (от 700тыс. позиций) по крону раз в сутки.

Как правильно разбить загрузку в скрипте чтобы скрипт после прохода 500 строк и импорта их в базу редиректился сам на себя, передавая оффсет и начинал импорт со следующих 500 строк? Или как это еще реализуется что бы успеть по таймауту и без использования ajax?

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

include(APPPATH . 'libraries/vendor/PHPExcel/Classes/PHPExcel.php');
# include parseCSV class.
include(APPPATH . 'libraries/vendor/parsecsv.lib.php');

class Import extends CI_Controller {

	public function import_cross()
	{
		
		set_time_limit(0);
		$data = array();

		$csv_file = FCPATH.'FTP/cross.csv';
		$count = count(file($csv_file));

		for ($i=1; $i < $count; $i+500) { 
			$csv = new parseCSV();
			$csv->delimiter = ';';
			$csv->offset = $i;
			$csv->limit = 500;
			$csv->parse($csv_file);

			foreach ($csv->data as $csv) {
				$data[] = array(
						'cross_proizv' => $csv[0],
						'cross_articul' => $csv[1],
						'cross_original_list' => $csv[2],
					);
			}
			$this->db->insert_batch('sp_cross', $data);

			unset($csv);
			unset($data);	
		}
	}
}
  • Вопрос задан
  • 764 просмотра
Решения вопроса 1
// отключаем индексы
ALTER TABLE db.my_table DISABLE KEYS;
// Затем загружаем огромный файл
LOAD DATA INFILE 'price.csv' INTO TABLE db.my_table;
// включаем индексы
ALTER TABLE db.my_table ENABLE KEYS;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@DuD
Если доступен крон на серваке то просто php %php_script_file.php% и никакого таймаута там быть не должно, это cli.
Ответ написан
Комментировать
MetaAbstract
@MetaAbstract
Архитектор информационных систем и баз данных. Ful
set_timeout(0)
Ответ написан
Комментировать
dmitriylanets
@dmitriylanets
веб-разработчик
1. если у вас импорт происходит по крону то о каком ajax идет речь?
2. в самом начале скрипта:
@set_time_limit(0);
		@ini_set("max_execution_time", 0);
		@ini_set("max_input_time", "3600");
		ignore_user_abort(true);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы