Изменение PHP: настройка параметров, версий и модулей
Основной способ изменения версии PHP через командную строку
Как переключить версию PHP для веб-сервера на Ubuntu или Debian?
Наиболее надёжный метод смены интерпретатора PHP в Linux-окружении - использование утилит update-alternatives и менеджеров модулей Apache (a2enmod/a2dismod) или переключение пула PHP-FPM. Это позволяет централизованно изменить версию для всех виртуальных хостов или всего сервера.
- Установите нужную версию, если она ещё не присутствует. Например, для PHP 8.1:
- Отключите текущую версию модуля Apache (если используется mod_php):
- Включите новую версию:
- Перезапустите Apache:
- Если используется PHP-FPM, последовательность иная - сначала останавливается старый пул, затем запускается новый. Для Nginx достаточно изменить директиву fastcgi_pass в конфигурации сервера.
sudo apt update
sudo apt install php8.1 php8.1-cli php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring
sudo a2dismod php7.4
sudo a2enmod php8.1
sudo systemctl restart apache2
Типичная ошибка: после переключения версии сайт отдаёт пустую страницу или ошибку 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.