Изменение PHP: настройка параметров, версий и модулей

Раздел: Администрирование PHP -> Настройка PHP

Основной способ изменения версии PHP через командную строку

Как переключить версию PHP для веб-сервера на Ubuntu или Debian?

Наиболее надёжный метод смены интерпретатора PHP в Linux-окружении - использование утилит update-alternatives и менеджеров модулей Apache (a2enmod/a2dismod) или переключение пула PHP-FPM. Это позволяет централизованно изменить версию для всех виртуальных хостов или всего сервера.

  1. Установите нужную версию, если она ещё не присутствует. Например, для PHP 8.1:
  2. sudo apt update
    sudo apt install php8.1 php8.1-cli php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring
  3. Отключите текущую версию модуля Apache (если используется mod_php):
  4. sudo a2dismod php7.4
  5. Включите новую версию:
  6. sudo a2enmod php8.1
  7. Перезапустите Apache:
  8. sudo systemctl restart apache2
  9. Если используется PHP-FPM, последовательность иная - сначала останавливается старый пул, затем запускается новый. Для Nginx достаточно изменить директиву fastcgi_pass в конфигурации сервера.

Типичная ошибка: после переключения версии сайт отдаёт пустую страницу или ошибку 500. Причина - несовместимость расширений или устаревший код. Проверьте логи Apache (/var/log/apache2/error.log) или PHP-FPM (/var/log/php8.1-fpm.log).

Решение: установите недостающие модули (например, php8.1-curl), а также проверьте файл php.ini на наличие устаревших директив.

Как изменить конфигурационные параметры PHP без смены версии?

Редактирование файла php.ini - основной способ настройки поведения интерпретатора. Файл может находиться в разных местах в зависимости от способа установки и SAPI. Для CLI: /etc/php/8.1/cli/php.ini, для Apache mod_php: /etc/php/8.1/apache2/php.ini, для FPM: /etc/php/8.1/fpm/php.ini.

# Увеличить лимит памяти до 256M
memory_limit = 256M
# Увеличить максимальный размер загружаемого файла
upload_max_filesize = 64M
post_max_size = 68M

После внесения изменений требуется перезапустить соответствующий сервис.

Возможная проблема: изменение не вступает в силу. Причина - редактирование не того файла php.ini. Проверьте актуальный путь через вызов phpinfo() или команду php -i | grep 'Loaded Configuration File'.

Ошибка синтаксиса: неверный формат значения (например, пробелы перед знаком равенства). Используйте строгий синтаксис: директива = значение.

Как переопределить настройки PHP для отдельной директории через .htaccess?

Если используется Apache с mod_php, можно задать некоторые директивы в файле .htaccess с помощью php_value и php_admin_value. Пример:

php_value upload_max_filesize 32M
php_value post_max_size 40M
php_value max_execution_time 120

Ограничение: не все директивы можно переопределять через .htaccess. Директивы, помеченные как PHP_INI_SYSTEM, доступны только в php.ini. При попытке изменить их через .htaccess сервер вернёт ошибку 500.

Как динамически менять параметры PHP внутри скрипта?

Функция ini_set() позволяет временно изменить значение директивы во время выполнения скрипта. Это полезно, когда нужно выставить увеличенный лимит для конкретной операции.

<?php
ini_set('memory_limit', '512M');
ini_set('max_execution_time', 300);
// ... resource-intensive code
?>

Замечание: ini_set() не может изменить директивы с режимом PHP_INI_SYSTEM. Для них требуется изменение php.ini или перезагрузка сервера.

Расширенные примеры изменения PHP

1. Полная смена версии с PHP 7.4 на 8.1 на Ubuntu 22.04 (с сохранением модулей)

Сначала устанавливаем репозиторий ppa:ondrej/php для доступа к нескольким версиям:

Пример
sudo add-apt-repository ppa:ondrej/php
sudo apt update

Устанавливаем PHP 8.1 и его расширения, аналогичные текущим:

Пример
sudo apt install php8.1 php8.1-cli php8.1-fpm \
  php8.1-mysql php8.1-xml php8.1-mbstring \
  php8.1-curl php8.1-gd php8.1-bcmath

Переключаем глобальный CLI через update-alternatives:

Пример
sudo update-alternatives --set php /usr/bin/php8.1
sudo update-alternatives --set phar /usr/bin/phar8.1
php -v
PHP 8.1.27 (cli) (built: Feb 10 2025 10:30:00) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.1.27, Copyright (c) Zend Technologies

Если сайт работает на Nginx + PHP-FPM, меняем пул в конфиге:

Пример
sudo nano /etc/nginx/sites-available/default
# Находим строку fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# Меняем на:
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;

Перезапускаем FPM и Nginx:

Пример
sudo systemctl stop php7.4-fpm
sudo systemctl start php8.1-fpm
sudo systemctl restart nginx

2. Настройка OPcache для высокой производительности

В файле php.ini для FPM (или mod_php) добавляем или меняем следующие строки:

Пример
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1

Проверяем, что OPcache активен, через phpinfo() или скрипт:

Пример
<?php
print_r(opcache_get_status(true));
?>
Array
(
    [opcache_enabled] => 1
    [cache_full] => 
    [restart_pending] => 
    [restart_in_progress] => 
    [memory_usage] => Array
        (
            [used_memory] => 2097152
            [free_memory] => 132120576
            [wasted_memory] => 0
            [current_wasted_percentage] => 0
        )
    ...
)

3. Изменение параметров для одного виртуального хоста в Apache (через конфигурацию)

Вместо .htaccess можно задать директивы в файле конфигурации виртуального хоста внутри секции <VirtualHost>. Это быстрее и безопаснее.

Пример
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example
    <Directory /var/www/example>
        php_value upload_max_filesize 128M
        php_value post_max_size 130M
        php_value memory_limit 256M
    </Directory>
</VirtualHost>

После изменения перезагружаем Apache:

Пример
sudo systemctl reload apache2

4. Использование файла .user.ini для отдельных директорий (FPM/CGI)

При работе через PHP-FPM или CGI можно создать файл .user.ini в корне проекта. Он действует аналогично .htaccess, но без дополнительной нагрузки на Apache.

Пример
; /var/www/site/.user.ini
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120

Изменения применяются сразу, перезапуск не требуется. Проверить загрузку файла можно через скрипт:

Пример
<?php
echo ini_get('upload_max_filesize');
?>
64M

5. Решение проблемы «Fatal error: Allowed memory size exhausted»

Если скрипт требует больше памяти, чем разрешено, можно временно увеличить лимит в начале выполнения:

Пример
<?php
ini_set('memory_limit', '-1'); // без ограничений
// или конкретное значение
ini_set('memory_limit', '1024M');

// Обработка большого массива
$data = file_get_contents('largefile.txt');
...
?>

Для постоянного решения измените php.ini или используйте .user.ini.

Изменение PHP - comments

En
Change php (php)