В рамках проекта server [admin] мы занимаемся настройкой и администрированием web-серверов. И, конечно, к нам обращаются за решением проблем с уже существующими, т.н. «боевыми» серверами.
Мы часто находим ошибки в конфигурации сервера, особенно если до нас на сервере работали разного рода «специалисты». Одной из наиболее частых проблем является неправильное значение параметра PHP memory_limit.
Что такое параметр PHP memory_limit
Итак, важно понимать, что значение PHP memory_limit — это значение для каждого исполняемого скрипта PHP. Можно представить себе это как ограничение скорости для автомобилей при движении по дороге — ограничение действует для каждого автомобиля и составляет конкретное значение — 60 км/ч, к примеру.
Для чего нужен параметр PHP memory_limit
Параметр PHP memory_limit появился именно для ограничения занимаемой оперативной памяти, которую использую PHP скрипты. Чаще всего проблемы с использованием памяти возникаю в плохо написанных скриптах. И вот для того, чтобы скрипт с допущенной утечкой памяти не «съел» всю доступную память сервера и был внедрен параметр PHP memory_limit.
Как проявляется проблема
Скорее всего в логах ошибок интерпретатора PHP будет что-то вроде:
или
Пример ошибочной конфигурации
Реальный кейс — подключаемся к серверу у которого 2048Мб (2Гб) оперативной памяти. Кто-то установил memory_limit значение 1024М (1Гб), полагая, что таким образом ограничит использование интерпретатором PHP памяти в 1Гб. В общем-то логично, но, к сожалению — это так не работает. На этом сервере криво был написан скрипт на PHP и памяти он потреблял около 800Мб, что само по себе — ненормально.
Так вот, пока скрипт запускался 1 — 2 раза одновременно — проблем не было, однако, когда на ресурс возросла нагрузка и скрипт запустился 3 или 4 раза одновременно (ну просто к одному и тому же скрипту обратились разные пользователи одновременно) — начались «падения» сервера и ошибки в логах. А так как скрипт потребляет 800Мб — ограничение в 1Гб не было достигнуто, что приводило к краху системы, ведь для запуска 3-х таких скриптов требовалось уже около 2,5Гб Памяти, а в наличии только 2Гб.
Где изменить и какую величину PHP memory_limit использовать
Настройка этого параметра производится в файле php.ini и имеет вид:
Альтернативно (в случае использования Apache в качестве бекенд-сервера) — можно использовать файл .htaccess и добавить туда директиву:
Мы рекомендуем использовать максимум 128Мб для ограничения PHP memory_limit, а лучше еще меньше. Если скрипту требуется больше 128Мб памяти, то в большинстве случаев требуется ревизия и оптимизация кода скрипта.
Выводы
Повторим еще раз — PHP memory_limit — это параметр для каждого отдельного скрипта PHP, а не ограничение для РНР в целом. И его неправильная настройка рано или поздно приведет к «падению» сайта и его недоступности для клиентов, что очень плохо как для ранжирования в поискоых системах, так и для репутации ресурса.
Для правильной настройки сервера необходимо обладать достаточными компетенциями и опытом соответствующей настройки. И мы крайне не рекомендуем допускать к настройкам сервера сомнительных «специалистов».
Специалисты server [admin] с удовольствием настроят Вам web-сервер так, как нужно.