Вопрос или проблема
В процессе миграции некоторых веб-сайтов на Apache/PHP/MySQL с Windows Server на Linux-хост, я восстановил их в файловую систему, настроил виртуальные хосты и всю сопутствующую инфраструктуру, подключился к базе данных MySQL и попытался войти в один из них. Через некоторое время возникло следующее сообщение об ошибке:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1228800 bytes)
Я думал, это будет просто, и изменил memory_limit
в /etc/php.ini
на 256M, затем перезапустил httpd. Не тут-то было! PHPInfo по-прежнему показывает старое значение:
memory_limit 128M 128M
и приложение все еще выдает ту же ошибку. Я дважды проверил, что PHPInfo также показывает тот же файл, который я редактировал:
Configuration File (php.ini) Path /etc
Loaded Configuration File /etc/php.ini
Scan this dir for additional .ini files /etc/php.d
Я искал memory_limit
в /etc
и нашел его в 3х файлах: php.ini
, php.ini.rpmnew
и php-fpm.d/www.conf
. Я полагаю, что по умолчанию в Linux сейчас используется php-fpm
, поэтому я изменил значение во всех 3х на 256, 257 и 258M, чтобы убедиться, но PHPInfo по-прежнему показывает 128M после перезапуска httpd
.
Я даже обратился к самому веб-приложению и изменил там их определения ограничения памяти, но безрезультатно.
Где скрывается лимит памяти?
Возможно, копия прячется в папке /etc
веб-приложения. Однако, если это php-fpm
, вероятно, он просто еще не обновил init файл. Пробовали перезапустить веб-сервис?
.
Ответ или решение
В процессе миграции веб-сайтов с использованием Apache/PHP/MySQL с хостинга на Windows Server на хостинг на Linux возникла проблема с изменением параметра memory_limit
в PHP. Несмотря на внесенные изменения в файлы конфигурации, проблема так и осталась нерешенной. Разберёмся, как найти и изменить «настоящий» конфигурационный файл PHP на Linux.
Причины проблемы
-
Несконфигурированная служба. Даже если изменения вносятся в правильный файл, если они не применяются на уровне службы, они не повлияют на поведение PHP.
-
Несколько файлов конфигурации. На системах Linux часто применяется структура, где конфигурация может быть распределена по нескольким файлам, что затрудняет определение единственного источника конфигурации.
-
Кэширование настроек. При внесении изменений необходимо убедиться, что изменения сразу применились, так как иногда PHP может кэшировать настройки.
Решение проблемы
-
Проверка всех конфигурационных файлов:
- Убедитесь, что все возможные файлы конфигурации проверены. Помимо
/etc/php.ini
, обратите внимание на директивы в/etc/php.d/
, которые могут переопределять основные настройки.
- Убедитесь, что все возможные файлы конфигурации проверены. Помимо
-
Проверка настроек PHP-FPM:
- Если используется
php-fpm
, необходимо перезапустить именно эту службу, а не толькоhttpd
. Выполните команду:sudo systemctl restart php-fpm
- Если используется
-
Проверка virtual host настроек:
- Проверьте конфигурации виртуальных хостов Apache или Nginx, которые могут содержать собственные значения PHP-параметров.
-
Включение из командной строки:
- Используйте команду
php --ini
, чтобы получить список загруженных конфигурационных файлов, и убедитесь, что ваш файлphp.ini
действительно используется.
- Используйте команду
-
Проверка на уровне веб-приложения:
- Убедитесь, что в приложении не задаются ограничения памяти программно, через методы PHP.
-
Проверка дополнительных параметров:
- Запустите
phpinfo()
в отдельном PHP-скрипте для полной информации о конфигурации, чтобы убедиться, что смотрите на правильную конфигурацию.
- Запустите
Заключение
При миграции на Linux сервер важно учитывать возможное разделение конфигураций и использование служб, таких как php-fpm. Убедитесь, что после изменения конфигурации все соответствующие службы перезапущены. Такие шаги помогут устранить проблему с изменением параметра memory_limit
в PHP. Этот подход обеспечит эффективное возвращение и поддержку работоспособности ваших приложений после миграции.
Не забывайте регулярно проверять и документировать конфигурации, это упростит устранение подобных проблем в будущем.