Настройка PHP: выбор и установка нужной версии

Раздел: Администрирование PHP -> Управление версиями PHP

Изменение версии PHP на сервере

Как переключить глобальную версию PHP в командной строке на Debian/Ubuntu?

Для систем на базе Debian и Ubuntu самым эффективным способом является использование механизма update-alternatives. Он позволяет задать приоритеты для разных версий PHP и переключаться между ними одной командой. Предварительно должны быть установлены необходимые пакеты, например php7.4-cli и php8.3-cli.

sudo update-alternatives --config php

Apt get install php (установка php через apt)

После выполнения команды отобразится список доступных версий. Пользователь вводит номер нужной альтернативы и нажимает Enter. Для автоматического назначения приоритета используется команда с опцией --set:

sudo update-alternatives --set php /usr/bin/php8.3

изменить версию php (изменение версии php)

Проверить результат можно командой php -v.

Возможные проблемы: Если альтернативы не зарегистрированы, следует вручную добавить их через --install:

sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.3 83

Ошибка "No alternatives for php" указывает на отсутствие зарегистрированных версий. Требуется установить соответствующие пакеты или добавить пути вручную.

Как изменить версию PHP для веб-сервера Apache?

Apache использует модуль libphp. Для переключения между версиями PHP (например, с 7.4 на 8.3) необходимо отключить один модуль и включить другой. Предварительно должны быть установлены соответствующие модули, например libapache2-mod-php7.4 и libapache2-mod-php8.3. Выполняются команды:

sudo a2dismod php7.4
sudo a2enmod php8.3
sudo systemctl restart apache2

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

Типичная ошибка: При попытке включить модуль появляется сообщение "Module php8.3 already enabled". Это означает, что модуль уже активен, но конфликтует с другим. Следует сначала отключить старую версию через a2dismod и убедиться, что не осталось лишних конфигураций.

Цель: Быстрое глобальное переключение PHP для всех сайтов на Apache.

Как настроить разные версии PHP для разных сайтов в Nginx?

Nginx взаимодействует с PHP через FPM (FastCGI Process Manager). Каждая версия PHP-FPM слушает свой сокет или порт. Для переключения конкретного сайта нужно указать соответствующий адрес в конфигурации location. Пример файла виртуального хоста (site1.conf):

server {
    listen 80;
    server_name site1.example.com;
    root /var/www/site1;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        include fastcgi_params;
    }
}

Для другого сайта путь к сокету может быть /run/php/php7.4-fpm.sock. После изменения конфигурации выполняется перезагрузка Nginx: sudo systemctl reload nginx.

Проблема: Ошибка "502 Bad Gateway" часто возникает, если указан неверный сокет или версия PHP-FPM не запущена. Проверить статус службы можно командой sudo systemctl status php8.3-fpm. Также следует убедиться, что файл сокета существует.

Цель: Гибкое распределение разных версий PHP под разные проекты на одном сервере.

Как временно запустить скрипт на другой версии PHP, не меняя глобальную?

Можно указать полный путь к исполняемому файлу нужной версии PHP. Например, для запуска скрипта script.php на PHP 8.3, оставаясь в системе с PHP 7.4 по умолчанию:

/usr/bin/php8.3 script.php

Аналогично при вызове composer или других утилит:

/usr/bin/php8.3 /usr/local/bin/composer install

Этот подход полезен для тестирования совместимости или однократного выполнения.

Ошибка: Если файл не найден, следует проверить наличие альтернатив: ls /usr/bin/php*. Также возможна ситуация, когда библиотеки PHP не совместимы с версией CLI.

Цель: Быстрая проверка кода без изменения основной конфигурации.

Как изменить версию PHP внутри Docker-контейнера?

В Docker версия PHP определяется образом, на основе которого собран контейнер. Для смены версии необходимо изменить тег образа в Dockerfile или docker-compose.yml. Например, замена php:7.4-apache на php:8.3-apache. После изменения требуется пересобрать контейнер:

docker-compose build
# или
docker build -t my-app:latest .

Для уже запущенного контейнера следует пересоздать его: docker-compose up -d --force-recreate.

Проблема: После смены образа может потребоваться обновить зависимости внутри контейнера (PHP-расширения, настройки). Используйте Dockerfile для установки необходимых пакетов.

Цель: Управление версией PHP в изолированной среде разработки или продакшена.

Расширенные примеры переключения версий PHP с подробными пояснениями.

Пример 1. Переключение через update-alternatives с регистрацией новых версий

Пример
# Регистрация PHP 8.3 как альтернативы с приоритетом 83
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.3 83

# Регистрация PHP 7.4 с приоритетом 74
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74

# Просмотр текущих альтернатив
sudo update-alternatives --display php

# Ручное переключение на PHP 8.3
sudo update-alternatives --set php /usr/bin/php8.3

# Проверка
php -v
PHP 8.3.12 (cli) (built: Oct  9 2024 10:23:45) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.3.12, Copyright (c) Zend Technologies

Пример 2. Настройка Apache с модулем PHP для нескольких версий (Debian/Ubuntu)

Пример
# Установка модулей
sudo apt install libapache2-mod-php7.4 libapache2-mod-php8.3

# Полное отключение PHP 7.4
sudo a2dismod php7.4
sudo a2enmod php8.3
sudo systemctl restart apache2

# Проверка через создание файла info.php в DocumentRoot
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
# Открыть в браузере страницу info.php - строка PHP Version укажет 8.3
На экране: PHP Version 8.3.12

Пример 3. Два сайта на Nginx с разными версиями PHP

Пример
# /etc/nginx/sites-available/site74.conf
server {
    listen 80;
    server_name legacy.example.com;
    root /var/www/legacy;
    index index.php;
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

# /etc/nginx/sites-available/site83.conf
server {
    listen 80;
    server_name modern.example.com;
    root /var/www/modern;
    index index.php;
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        include fastcgi_params;
    }
}

# Включение конфигураций
sudo ln -s /etc/nginx/sites-available/site74.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site83.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
После перезагрузки legacy.example.com использует PHP 7.4, modern.example.com - PHP 8.3.

Пример 4. Docker-compose с выбором версии PHP через переменную окружения

Пример
# docker-compose.yml
version: '3'
services:
  web:
    image: php:${PHP_VERSION}-apache
    volumes:
      - ./src:/var/www/html
    ports:
      - "8080:80"

# Файл .env
PHP_VERSION=8.3

# Сборка и запуск
docker-compose up -d

# Проверка версии внутри контейнера
docker exec <container_id> php -v
PHP 8.3.12 (cli) (built: Oct  9 2024 10:24:01) ( NTS )

Изменение версии PHP - comments

En
изменить версию php (php)