#Симптомы и отличие от похожих неисправностей
При длительном импорте CSV или большого архива PHP-FPM принудительно завершает работающий процесс по request_terminate_timeout, после чего браузер получает 502/504 или оборванное соединение. Как определить, какой таймаут сработал, и безопасно обработать большой объём. В отличие от обычной ошибки upload_max_filesize, файл может успешно загрузиться, а сбой возникает уже во время обработки внутри PHP. Увеличение времени запроса не решает проблему частично записанных данных и занятого работника.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Установлен короткий request_terminate_timeoutFPM останавливает работника через заданный период обслуживания запроса, даже когда код ещё занят обработкой. | В журнале FPM есть execution timed out ... terminating и затем сообщение о завершении процесса. | Сопоставить лимит со временем импорта и разделить обработку на порции. |
Сработал другой предел до PHP-FPMNginx fastcgi_read_timeout, PHP max_execution_time или клиентское ожидание обрывают ответ по другой причине. | В Nginx upstream timed out, но нет сообщения FPM о принудительном завершении. | Разграничить записи журналов по одной операции. |
| Импорт выполняется без контрольных точек и повторных попытокВесь архив разбирается в одном HTTP-запросе; ошибка оставляет часть строк внесёнными. | Повторный импорт создаёт дубли или результаты частично появляются. | Сделать идемпотентное порционное выполнение с учётом состояния. |
#Диагностика и пошаговое устранение
- Зафиксируйте границу между загрузкой файла и его обработкойВ браузере начните тестовый импорт небольшого обезличенного файла. Запишите размер, количество строк, время нажатия «Импортировать», последнюю отображённую стадию и код ответа. Если файл вообще не попал на сервер и ошибка возникает мгновенно, сначала проверьте
upload_max_filesizeи лимит Nginx — эта инструкция касается сбоя после начала PHP-обработки.
- Найдите конкретный текст о завершении процесса в журналеОткройте в панели сервера журнал ошибок нужного пула PHP-FPM. По SSH для стандартного systemd-сервиса используйте
sudo journalctl -u php8.2-fpm --since "30 min ago" --no-pagerс заменой версии. Ищите строки вродеexecution timed out (60.000000 sec), terminatingиchild ... exited on signal 15. Если таких строк нет, сопоставьте время с журналом Nginx, чтобы не обвинять FPM по одному ответу 504.Linux · Терминал (Bash)КомандаНужен sudoТолько чтение журнала systemd. Пример имени службы для Debian PHP 8.2; для панели/другой версии смотрите её собственный журнал.sudo journalctl -u php8.2-fpm --since "30 min ago" --no-pager
- Проверьте активный предел FPM и другие таймауты по цепочкеВ конфигурации конкретного пула найдите
request_terminate_timeout. Запишите значение с единицами:60sозначает 60 секунд,0выключает ограничитель. Отдельно проверьтеmax_execution_timeв PHP иfastcgi_read_timeoutв конфигурации Nginx. Таймаут Nginx относится к промежутку ожидания данных между чтениями, а не обязательно к общей продолжительности передачи. Не изменяйте все три величины заодно: требуется доказательство сработавшего предела.
- Проверьте сохранность данных перед повторомЕсли импорт мог остановиться посередине, сначала откройте в панели приложения список загруженных записей и сравните их количество с файлом. Сохраните резервную копию затронутой базы и файла импорта до повторной попытки. Обсудите с разработчиком уникальный идентификатор записей и возможность безопасного повторного запуска; простой повтор часто создаёт дубликаты. Не запускайте очистку таблиц ради повторного импорта.
- Предпочтите порционную обработку, а не бесконечный HTTP-запросРазработчик должен отделить приём файла от обработки: после загрузки создать задачу со статусом, читать строки порциями, фиксировать номер последней обработанной записи и сохранять результат в транзакциях разумного размера. В браузере пользователь должен видеть ход задачи и сообщение о завершении. Для PHP CLI или очереди задач настройте ограничение числа параллельных импортов, ошибки, повторное исполнение и доступ к файлу без раскрытия его публично.
- Используйте ограниченное временное увеличение только для подтверждённого случаяЕсли архитектуру импорта нельзя изменить сразу, а импорт ограничен администраторами и проверены RAM/база/прокси, временно увеличьте
request_terminate_timeoutтолько в соответствующем пуле на заранее рассчитанное значение. Например, из 60s в 120s при измеренной операции 75s; это иллюстрация, не гарантия. Запишите исходный лимит и согласуйте период диагностики: более длинный запрос занимает процесс, а клиенты всё равно могут завершить ожидание. - Только пример временной диагностики для подтверждённого запроса ~75 секундINIТолько пример временной диагностики для подтверждённого запроса ~75 секунд. Не копируйте без измерений и оценки рисков.
request_terminate_timeout = 120s
- Проверьте и примените конфигурацию без остановки всех сайтовПосле резервного копирования файла пула выполните проверку нужного PHP-FPM, например
sudo php-fpm8.2 -t. Если тест успешен, используйтеsudo systemctl reload php8.2-fpm; при ошибке восстановите файл, не выполняйте reload. Учитывайте, что reload не продлевает уже выполняющийся запрос: новый лимит проверяйте на следующей тестовой задаче.Linux · Терминал (Bash)С осторожностьюНужен sudoДля Debian PHP 8.2, с правами администратора. Версию и службу следует заменить; reload только после успешной проверки. Команда перезагрузки выполняется только при успешной проверке конфигурации (оператор &&). При ошибке исправьте конфигурацию и повторите проверку; не запускайте перезагрузку вручную.sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Повторите тест на копии данных и зафиксируйте откатЗапустите контролируемый импорт в тестовой копии базы, после завершения сравните число строк, контрольные суммы и журнал приложения. При отсутствии прерываний проверьте повторный запуск: он не должен размножать записи. Если FPM продолжает убивать процесс или Nginx отвечает 504, восстановите исходный таймаут и разберите другой ограничитель. Даже если временное увеличение помогло, замените долгий HTTP-импорт фоновой работой в плановом исправлении.
#Как проверить результат и что предпринять при неуспехе
Успех — обработка тестового файла завершается полностью, подтверждён итоговый счёт записей, повтор не создаёт дублей, FPM не завершает работников по таймауту. При расхождении количества записей вернитесь к резервной копии в тестовой среде и выясните точку сбоя; не повторяйте импорт в живую базу без стратегии восстановления.