Импорт *.csv файла в MySQL с помощью PHP

Andrey3681

Новичок
Как правильно сделать:
есть файл csv 500000 строк, каждый день добавляются примерно 20000 и изменяются имеющиеся
Нужно каждый день обновлять БД до актуальной

Перед загрузкой очищаю БД. Загрузка по столбцу INSERT первый столбец, потом header("Location:".$url); на ту же страницу с GET параметром, по которому запускаю UPDATE второй и т.д
Если без перенаправления 504 Gateway Time-out

PHP:
$truncate = "TRUNCATE TABLE femida_edrsr_documents";
        $mysqli->query($truncate);
     
        if (($handle = fopen("database_EDRSR/documents.csv", "r")) !== FALSE) {
            while (($dataFile = fgetcsv($handle, 0, "\t")) !== FALSE) {
                $num = count($dataFile);
                $doc_id .= $dataFile[0].",";
            }
            fclose($handle);
        }
     
        $doc_id = explode(",", $doc_id);
        $count = count($doc_id) - 2;
     
        for($i = 1; $i <= $count; $i++)
        {
            $values .= "('".str_replace("'", "’", $doc_id[$i])."'),";
        }
     
        $values = substr($values, 0, -1);
        $insert = "INSERT INTO femida_edrsr_documents (doc_id) VALUES $values";
        $mysqli->query($insert);
Или правильней сравнивать строки с БД, если строрка изменилась UPDATE, если нету INSERT
Скрипт нужно запускать Cron

Или как вообще можно реализовать задуманое?
 

Andrey3681

Новичок
@Andrey3681,
LOAD DATA INFILE .. INTO TABLE ... CHARACTER SET 'cp1251' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES
(список полей в порядке следования в ксс)
Первым делом пытался так.
Ответ от провайдера "Вы пытаетесь использовать привилегию LOAD DATA INFILE, которой нету у Вас. Нужно скриптом разделить строку на поля и сделать обычный insert
"
 

sanmai

Новичок
Если у вас есть ID документа `doc_id`, то может быть быстрее делать INSERT ... ON DUPLICATE KEY UPDATE... Документация

Семафоры сделать можно, но очень легко облажаться. Делайте так в кроне:

Код:
@hourly flock /path/to/import.php php /path/to/import.php
flock есть во всех юниксах:

https://www.freebsd.org/cgi/man.cgi?query=flock
https://linux.die.net/man/2/flock

Ну и конечно вам бы перейти с шаредного хостинга на VPS какой или bare metal.
 
Сверху