PHP « Импорт CSV большого размера
Здравствуйте! Подскажите, как рациональней импортировать таблицу csv в базу данных. Импортировать придется еженедельно. В настоящее время она состоит из более чем 3млн строк и весит порядка 200 Мб.
Производить импорт целиком или разбивать ее на множество файлов?
P.S. в php.ini значения memory_limit = 128M и memory_limit = 256M.
Производить импорт целиком или разбивать ее на множество файлов?
P.S. в php.ini значения memory_limit = 128M и memory_limit = 256M.
1 ответов
собственно считать все строки через fgetcsv в цикле
Читаем про команду MySql LOAD DATA INFILE и не изобретаем велосипед.
http://phpclub.ru/mysql/doc/load-data.html
Есть другой вариант. Импортировать по частям. В идеале можно импортировать какое то определённое количество строк или записей в зависимости от структуры файла, при завершении обработки скрипт вернёт место в файле с которого необходимо начать. А если сделать такую процедуру через обычный ajax с получением и отсылкой места на котором скрипт закончил обработку строки, то можно поставить на импорт и пойти курить.
if( isset( $_GET['setimport'] ) ){
$file_name = ''; // абсолютный путь до файла
if( !empty( $_GET['setimport'] ) ){
$line = intval( $_GET['setimport'] );
}
else{
$line = 0;
}
import_big_file( $line, $file_name );
}
//Построчное считываение файла
function import_big_file( $im = 0, $file_name ){
$count_line = 0; //количество записей
if ( ( $handle_f = fopen( $file_name, "r" ) ) !== FALSE ){
fseek( $handle_f, $im );
while ( !feof( $handle_f ) ){
$line = fgets( $handle_f, 4096 );
//обрабатываем строку
echo $line;
//считаем количество строк
if( $count_line >=300 ){
echo "<div><a href='?setimport=" . ftell($handle_f) . "'>Продолжить импорт с " . ftell($handle_f) . "</a>";
break 1;
}
}
fclose( $handle_f );
}
else{
echo "Не получилось открыть файл";
}
}
таким способом импортировал с внесением или обновлением записей в базе в зависимости от параметров в строке файлы размером от 300 метров.