2015-06-02 2 views
0

Мне нужно создать веб-страницу, которую человек может использовать для выбора и загрузки текстового файла (например: csv), и импортировать этот файл в базу данных mysql.Загрузка большого (~ 80Mb) текстового файла и сохранение в базу данных?

Все в порядке, и у меня есть PHP-код, который сделает это - примите загрузку, анализ, сохранение в базу данных.

Проблема в том, что мне нужен надежный метод, который позволит пользователю загружать очень большие файлы, потенциально около 30 - 80 МБ, без тайминга или сбоев во время загрузки или сохранения в базу данных.

Помимо увеличения настроек ограничения загрузки и таймаута, есть ли какие-либо другие рекомендации относительно того, как я могу обеспечить стабильно надежный метод для обеспечения загрузки всех данных?

Набор данных изменяется ежедневно, и все данные предыдущего дня в базе данных должны быть очищены и заменены данными нового дня, поэтому очень важно, чтобы во время новой загрузки данные не терялись.

Я хотел бы приветствовать советы других относительно того, как наилучшим образом достичь этого, с высокой степенью уверенности, что данные будут загружены надежно и успешно, и как лучше всего выполнить очистку данных предыдущих дней - в идеале было бы лучше проверить, что новые данные были полностью загружены, прежде чем очищать и заменять предыдущие данные.

Все предложения приветствуются!

+0

Возможный дублирующийся вопрос только с запросом о загрузке - не о надежной замене данных базы данных новыми загруженными данными. Он также требует индикатора выполнения и предлагает решения на основе флэш-памяти. – Richard

+0

Я знаю о своем дуэмхаммере, и я умышленно не * флагов * как дубликат, так как есть действительно различия. Я просто сделал ссылку на вопрос, который мог бы дать вам ответ. Но отлично, видимо, этого не происходит, поэтому я удалил комментарий. – GolezTrol

+0

О загружаемом размере и потенциальных проблемах, которые могут возникнуть ... возможно, вам стоит рассмотреть возможность загрузки zip-сжатых данных (а затем снова распаковать их на сервере через PHP или команду оболочки). Текстовые данные обычно обеспечивают очень хорошие коэффициенты сжатия. (Dunno, если можно ожидать отскакивание перед загрузкой из базы пользователей, на которую вы нацеливаетесь ... возможно, сделать это необязательным, с помощью флажка «это файл с сжатым сжатием ZIP» или автоматическое обнаружение на стороне сервера.) – CBroe

ответ

1

Я думаю, что тайм-аут не считается до тех пор, пока файл загружается. Данные файла являются частью запроса, а таймаут запускается только после полного отправки запроса.

Затем вместо разбора файла в запросе вы можете проанализировать его с помощью задания cron после его загрузки.

1

Просмотрите загружаемые файлы, такие как fine uploader, которые купят ваши загрузки и разрешат возобновление, если соединение прерывается (вместо начала с начала каждый раз).

Другой потенциал роста с загрузчиком, как и прекрасным загрузчиком, заключается в том, что пользователь знает, сколько еще он/она должен ждать, пока загрузка не будет выполнена.

2

Существует стековое Переполнение вопрос, чтобы подтвердить ответ GolezTrol о том, что PHP тайм-аут не начинается до тех пор, после того, как загрузка будет завершена: PHP file upload affected or not by max_input_time?

Что касается собственно обработок данных, если файл находится в CSV/вкладке -delimited или подобный формат, который соответствует структуре таблицы, самый быстрый способ заключается в использовании LOAD DATA заявления в MySQL: https://dev.mysql.com/doc/refman/5.5/en/loading-tables.html

для аспекта замены данных и убедившись, что импорт был успешным, прежде чем удалить старые данные, лучший ответ этот вопрос: MySQL: Truncate Table within Transaction? рассказывает о том, как вы можете это сделать, вставив данные в новую таблицу, затем, как только вы проверите новые данные, переименуйте таблицы для их замены. Затем вы можете безопасно удалить старые данные. Это похоже на самый жидкий способ достижения этого (имея в виду, что TRUNCATE не является безопасным для транзакций).

1

Если вы считаете, что импорт после загрузки может быть проблемой с точки зрения времени обработки и обратной связи с пользователем. Я предлагаю сделать «рабочий», который работает в фоновом режиме и позволяет пользователям знать, когда данные будут готовы. Таким образом, вы также можете многократно загружать файлы там и обрабатывать их, когда есть мощность процессора или доступное время жесткого диска.

Смежные вопросы