@LionG

Как правильно сделать загрузку большой таблицы csv в MySQL средствами PHP (Request Timeout)?

Написал плагин для WP, в настройках есть формы для отправки csv файлов. На бэке, паршу csv и пишу в бд прописав
ignore_user_abort(true);
set_time_limit(0);


Все работало хорошо... сменили хостинг и появились файлы с еще большим числом строк. Начал вылетать
Request Timeout

This request takes too long to process, it is timed out by the server. If it should not be timed out, please contact administrator of this web site to increase 'Connection Timeout'.


Пробовали в настройках PHP выставить
php_value max_execution_time -1
set_time_limit 0

не помогло.

Файл костыльно удалось загрузить через phpmyadmin ручным импортом csv в таблицу.
Вижу 2 пути, либо копать почему вылетает timeout, либо изменить код импорта...
Timout при импорте через форму вылетел быстрее чем работал импорт в phpmyadmin что странно.
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
То, что Вы описали (когда в браузере "Таймаут" а скрипт продолжает работать) скорее всего связано с режимом работы PHP - [F]CGI (или подобным), в этом режиме сервер ждёт какое-то время (обычно секунд 30) ответа от CGI-сервера (PHP) и не дождавшись (точнее по истечению этого времени) выдаёт timeout (который Вы скорее всего и наблюдали).

На мой взгляд, наиболее простое решение (которое лично я бы рассматривал в первую очередь) - удалённое подключение к БД и загрузка данных. То есть, БД на хостинге а грузите в неё данные Вы с локальной машины, из программы для администрирования БД или из того же локально запущенного PHP-скрипта, это позволит как минимум настроить любой параметр (в т.ч. таймауты, т.к. подобных настроек сделать на хостинге скорее всего нельзя), либо вообще избавиться от понятия "таймаутов" (в случае использования ПО для работы с БД).

Альтернативный вариант - напишите скрипт, который будет загружать, например по 1000 строк из Excel'я, после чего генерировать ответ (HTML-страницу), которая будет запускать этот же скрипт, с параметром "следующие 1000 строк" и так рекурсивно, до полной загрузки данных. При особом желании можно попытаться отслеживать текущее время выполнения скрипта и при приближении к порогу - соотв. генерировать ответ (как описано выше).

P.S. Ещё один важный момент - вставка данных в режиме "1 INSERT много VALUES" обычно работает ощутимо быстрее, чем "1 INSERT 1 строка".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы