S
S
sllugovskih2016-07-27 14:30:53
MySQL
sllugovskih, 2016-07-27 14:30:53

Importing large price lists into a MySQL database?

Привет всем. Делаю интернет-магазин на фреймворке 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);	
    }
  }
}

Answer the question

In order to leave comments, you need to log in

4 answer(s)
O
Optimus, 2016-07-27
@sllugovskih

// отключаем индексы
ALTER TABLE db.my_table DISABLE KEYS;
// Затем загружаем огромный файл
LOAD DATA INFILE 'price.csv' INTO TABLE db.my_table;
// включаем индексы
ALTER TABLE db.my_table ENABLE KEYS;

D
DuD, 2016-07-27
@DuD

If cron is available on the server, then simply php %php_script_file.php% and there should not be any timeout, this is cli.

A
Artemy, 2016-07-27
@MetaAbstract

set_timeout(0)

D
dmitriy, 2016-07-27
@dmitriylanets

1. if your import is done by cron then what kind of ajax are we talking about?
2. at the very beginning of the script:

@set_time_limit(0);
    @ini_set("max_execution_time", 0);
    @ini_set("max_input_time", "3600");
    ignore_user_abort(true);

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question