Приветствую всех. Я тут новенький, да и в программировании на PHP я факультативно, но нравится это дело. Подскажите, как правильно решать мою проблему? извините, если длинно. Сайт на хостинге PHP+MySQL. Ограничение по выполнению скрипта 2 минуты. Задача в базу загрузить прайс 600-900 тыс. строк (CSV 85-100 Мб). При этом надо не тупо брать строки из файла и заливать в базу, а обрабатывать их, пересчитывать цены и т.д., а потом заливать. Как делаю сейчас (для маленьких файлов до 60 тыс строк): 1. Загружаю файл на сервер через форму на сайте. 2. Читаю его по строкам, изменяю те параметры которые надо и заливаю в базу. 3. На экран вывожу строку, что мол такая-то запись занесена успешно. Если файл больше 60 тыс. строк, то скрипт отваливается по таймауту. Как делаю сейчас (для больших файлов): 1. На локальном компе запускаю Denwer 2. Загружаю файл на локальных сайт через форму. 3. Читаю его по строкам, изменяю те параметры которые надо и заливаю в базу. Поставил безумно большое время исполнения скрипта, поэтому файл за 10 мин успевает загрузиться. 4. Вручную программой Navicat соединяю свой локальный MySQL и MySQL на хостинге (прямой вход есть с ограничением по IP). Перекачиваю базу с одного SQL на другой. Всё. Сами видите, что жуть как криво. Я не особо программер, делал для своих нужд, по ходу дела изучал PHP, MySQL и т.д. Наверняка есть более простые и универсальные способы решить мою задачу на хостинге по загрузке маленьких и больших прайсов. Поскажите хоть в двух словах, как бы делали вы, а я уж потом покопаю в этом направлении.
Wrong way. Если это стандартная операция, то стоит завести таблицу с сырыми данными, а потом обработать с помощью хранимых процедур БД. Можно даже не обрабатывать а строить view.
Я вас правильно понял... Залить файл как есть во временную таблицу, потом с помощью хранимых процедур преобразовать данные в нужные и результат залить в постоянную таблицу? Придется разобраться, что это за зверь "хранимые процедуры" и сильно ли они грузят хостинг, т.к. записей то под 1 млн. в некоторых таблицах. Может есть какой-то способ пакетной загрузки файла, чтоб не каждую строчку из файла брать и делать INSERT ?
да Код (Text): INSERT INTO `table` (`field_1`, `filed_2`...) VALUES ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...)... узнать максимальную длину запроса в байтах можно с помощью запроса Код (Text): SHOW VARIABLES LIKE 'max_allowed_packet'; обычно это мегабайт, то есть можно тысячи строк склеить в один запрос.
Несколько вариантов решения задачи. Если файлы у вас загружены на сервер Напишите скрипт который разделит эти файлы на мелкие и далее с помощью фронтенда, ajax(посылаем и контролируем команды) отрабатываем наши файлы. Так-же рассмотрите использование загрузки в базу с помощью LOAD DATA