Восстановление Bitrix: преодоление ограничений памяти и размера файла
Восстановление Bitrix из бекапа: проблема с нехваткой места и ограничениями PHP
При попытке восстановить сайт на CMS "1С-Битрикс" через скрипт restore.php пользователи часто сталкиваются с ошибкой "Недостаточно места" или "Прервано из-за нехватки памяти". Причина кроется не в физическом дисковом пространстве, а в лимитах PHP: memory_limit, upload_max_filesize, post_max_size, max_execution_time. Далее рассмотрены способы обойти эти ограничения.
Как увеличить лимиты PHP через .htaccess, чтобы восстановить бекап без ошибок?
Самый простой и часто работающий способ - добавить директивы в файл .htaccess в корневой директории сайта (там же, где лежит restore.php).
Пример кода для .htaccess:
php_value upload_max_filesize 200M
php_value post_max_size 200M
php_value memory_limit 512M
php_value max_execution_time 300
php_value max_input_time 300Restore php bitrix не могу место (недостаточно места при восстановлении bitrix через restore.php)
Пояснение: Каждая строка устанавливает соответствующий параметр. upload_max_filesize и post_max_size отвечают за размер загружаемого архива; memory_limit - объём памяти для выполнения скрипта; max_execution_time - максимальное время работы скрипта в секундах. После сохранения файла необходимо перезагрузить веб-сервер (Apache) или подождать несколько секунд, если используется mod_php.
Типичная ошибка: Сервер возвращает 500 Internal Server Error. Это означает, что модуль mod_rewrite не поддерживает директивы php_value (например, при использовании FastCGI или PHP-FPM). Решение описано в следующем разделе.
Другая проблема: После добавления директив restore.php всё равно не видит изменений. Необходимо убедиться, что файл .htaccess читается сервером (проверить AllowOverride All в конфигурации Apache).
Как изменить лимиты PHP, если сервер использует PHP-FPM или FastCGI?
Для таких конфигураций директива php_value в .htaccess не работает. Альтернатива - использовать файл .user.ini (поддерживается во многих современных хостингах).
Пример .user.ini:
upload_max_filesize = 200M
post_max_size = 200M
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
Этот файл кладётся в корень сайта (вместе с restore.php). Изменения применяются сразу, без перезапуска сервера.
Ошибка: Если хостинг не поддерживает .user.ini, можно попросить администратора увеличить лимиты глобально через php.ini или пул PHP-FPM. В некоторых случаях помогает создание собственного php.ini в директории restore.php (требуется поддержка PHP_INI_PERDIR).
Как восстановить бекап через командную строку, избежав лимитов веб-сервера?
Если веб-сервер не позволяет изменить лимиты, а у вас есть доступ к SSH, можно запустить restore.php из консоли. Это снимает ограничения по времени и памяти (используются значения из CLI-версии PHP).
Команда:
php /путь/к/restore.php
Перед запуском убедитесь, что архив бекапа лежит рядом с restore.php или укажите путь через браузерный интерфейс (в консольном режиме скрипт запросит путь).
Проблема: Команда может не выполниться из-за нехватки оперативной памяти на сервере. Тогда следует временно увеличить лимиты PHP для CLI-режима в файле php.ini (обычно /etc/php/8.x/cli/php.ini).
Как разбить большой дамп, чтобы обойти ограничение на размер загрузки?
Если архив бекапа занимает более 200-500 МБ, его загрузка через браузер часто прерывается. Решение - разделить дамп на части с помощью архиватора (tar, zip с разбивкой).
Пример разбивки tar-архива:
tar -cvzf backup.tar.gz /путь/к/папке/сайта
split -b 100M backup.tar.gz backup_part_
Затем на сервере собрать обратно: cat backup_part_* > backup.tar.gz. После этого можно запустить restore.php, указав целый файл.
Типичная ошибка: Split создаёт файлы с суффиксами aa, ab, ac. При склеивании через cat порядок сохраняется, но нужно убедиться, что нет дополнительных файлов.
Как увеличить время выполнения restore.php, если скрипт обрывается спустя 30 секунд?
Если лимиты PHP уже установлены, но процесс всё равно сбрасывается, возможно, проблема в настройках прокси-сервера (Nginx, load balancer). Для Nginx нужно увеличить proxy_read_timeout и fastcgi_read_timeout.
Пример для Nginx (в секции server):
proxy_read_timeout 600;
fastcgi_read_timeout 600;
client_max_body_size 200M;
После изменений перезагрузить Nginx: nginx -s reload.
Ошибка: Если клиент прерывает соединение из-за настроек браузера (тайм-аут загрузки), то это исправляется только разбивкой архива или использованием консольного режима.
Расширенные примеры для восстановления Bitrix через restore.php
Пример 1: Проверка текущих лимитов PHP с помощью phpinfo() – создание временного скрипта.
<?php
phpinfo();
?>
Сохранить как info.php в корень сайта, открыть в браузере. Искать строки memory_limit, upload_max_filesize и т.д. После проверки удалить файл.
После открытия выводится таблица со значениями директив. Например: memory_limit = 128M upload_max_filesize = 64M
Пример 2: Временное увеличение memory_limit непосредственно в restore.php.
// В самом начале файла restore.php (после <?php)
ini_set('memory_limit', '512M');
ini_set('max_execution_time', 300);
ini_set('upload_max_filesize', '200M');
ini_set('post_max_size', '200M');
Результат: скрипт работает с заданными параметрами, даже если php.ini устанавливает меньшие значения.
После внесения изменений загрузка архива и распаковка выполняются без ошибок при условии, что хватает физической памяти.
Пример 3: Установка переменных окружения для PHP-FPM через pool.d.
; В файле /etc/php/8.1/fpm/pool.d/www.conf (или аналогичном)
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 200M
php_admin_value[post_max_size] = 200M
php_admin_value[max_execution_time] = 300
После изменения перезапустить PHP-FPM: systemctl restart php8.1-fpm.
Значения становятся доступны для всех сайтов на пуле. Проверить через phpinfo().
Пример 4: Разбивка ZIP-архива для обхода лимита на размер файла.
# Создать многотомный ZIP (размер тома 100 МБ)
zip -s 100m backup.zip backup.tar.gz
# На сервере объединить
zip -F backup.zip --out full_backup.zip
После объединения получается единый файл full_backup.zip, который можно использовать в restore.php.
Пример 5: Запуск восстановления из консоли с указанием php.ini собственного.
php -c /путь/к/my_php.ini /путь/к/restore.php
В файле my_php.ini прописать необходимые лимиты. Результат: скрипт использует указанный конфигурационный файл, полностью обходя ограничения веб-сервера.
Восстановление выполняется в терминале, прогресс отображается построчно. Останавливается только при нехватке оперативной памяти.
Пример 6: Настройка Nginx для прямой загрузки больших файлов (через sendfile).
location / {
proxy_pass http://backend;
proxy_request_buffering off;
client_max_body_size 500M;
}
Значение client_max_body_size должно быть больше размера загружаемого архива. Если не задать, запрос обрывается с кодом 413.