Настройка файла php.ini для высоконагруженных сайтов

php.ini - конфигурационный файл интерпретатора PHP. Интерпретатор php может поставляться в виде модуля для Apache, выполнять скрипты из командной строки или в виде отдельного сервиса php-fpm. Эти сервисы отличаются своими возможностями, и предназначением, но для любого вида интерпретатора нужно задать базовые настройки, например, рабочая папка, включенные расширения, отображение ошибок и так далее. Все эти настройки задаются через файл php.ini.

Расположение файла php.ini в разных операционных системах и разных панелей управления хостингом отличается. Ini файлов может быть много, под каждую версию PHP - отдельный php.ini. Чтобы узнать какой php.ini загружен для вашего сайта, нужно узнать чему равен параметр "Loaded Configuration File", например через функцию phpinfo(). Или использовать консольную команду:

php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/8.2/cli
Loaded Configuration File => /etc/php/8.2/cli/php.ini

Давайте разберем поиск php.ini на сложном примере установки модуля IonCube, при условии установленных разных версий интерпретатора PHP на вашем VPS.

После покупки VPS и установки панели, зачастую нужно сразу меня настройки по умолчанию PHP. Если установлена панель, лучше это делать через нее, а не на прямую в консоли. В любом случае, я описываю что нужно менять, а каким способом решать вам. Подробнее об используемых директивах PHP читайте ниже.

Для моего сайта php.ini расположен по пути /etc/php/8.1/fpm/php.ini (как искать php.ini читайте выше). Обязательно делайте бэкап файла.

И так какие базовые настройки нужно менять сразу в php.ini для высоконагруженных сайтов:

;date.timezone менять опционально
date.timezone = Europe/Kyiv
memory_limit = 512M
upload_max_filesize = 80M
post_max_size = 80M

После изменения, нужно указать ОС перечитать настройки, в моем случае это будет команда:

systemctl reload php8.1-fpm.service

Изучите также статьи - это будет полезно для понимания сделанных изменений в php.ini:

Пример получения значение параметра из php.ini при помощи PHP кода:

<?php echo ini_get('post_max_size'); ?>
  • register_long_arrays Off - сообщает PHP, следует ли регистрировать устаревшие длинные предопределенные переменные типа $HTTP_*_VARS. Если вы их не используете, рекомендуем отключить их из соображений производительности. Вместо них следует использовать суперглобальные массивы, например $_GET. Эта директива стала доступна начиная с версии PHP 5.0.0.
  • register_globals Off - запрещает регистрацию переменных, полученных методом Метод HTTP POST или get в глобальный массив $GLOBALS. Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.
    • memory_limit - максимальный объем памяти, выделяемый сценарию
    • date.timezone указывает часовой пояс для вашего сайта: Список поддерживаемых временных (часовых) зон.
    • upload_max_filesize - максимальный размер загружаемого файла на сервер.
    • post_max_size - максимальный размер данных, которые могут быть отправлены по методу POST. Как правило, значение должно быть больше, чем upload_max_filesize и меньше, чем memory_limit. Используются символы для значений байта: K(kilo), M(mega), и G(giga). Например, 80M.

Распространённые ошибки PHP

Ограничение по ресурсам:

  • max_execution_time = число

Устанавливется максимальное возможное время выполнения скрипта в секундах.

  • max_input_time = число

Максимально возможное время в секундах, которое скрипт может потратить на обработку загружаемых данных.

  • memory_limit = 8m

Максимальный объем памяти, выделяемый сценарию, составляет, например, 8 Мбайт.

Fatal error: Allowed memory size of 54554432 bytes exhausted (tried to allocate ….."

Эта ошибка означает, что ваш скрипт для выполнения требует памяти больше, чем разрешено в настройках PHP на сервере. Т.е. запрашиваемое значение превышает максимальное количество оперативной памяти предоставляемого пользовательскому аккаунту виртуальным хостингом.

Решение:

  • Попробовать самостоятельно изменить это значение, добавив в самое начала index.php (расположенного в корне сайта) следующие строчки:
    <?php ini_set("memory_limit", "32M"); ?>

    это если хостер не отключил поддержку ini_set в настройках сервера.

  • Положить в корень сайта файл .htaccess следующего содержания:
    php_value memory_limit 32M

    лимит можно изменять самостоятельно, можно поставить и 64M но не наглеть :) Если же такой файл уже есть в корне сайта — просто добавьте в него приведенную выше строку. Если у хостера PHP работает ка PHP-CGI через suPHP, то это может вызвать ошибку 500, значить использовать директивы php_flag, php_value в файле .htaccess невозможно!

  • Некоторые хостеры поддерживают работу php.ini у клиента, т.е. вы можете самостоятельно делать свои настройки PHP для своей учетной записи. А значить создайте файл php.ini в корне сайта и добавьте следующий код:
    memory_limit = 32M
  • Если это не помогло — обратитесь к администратору хостинга и попросите увеличить количество доступной памяти для PHP.
PQ VPS сервера в 28+ странах.