Управление версиями PHP: современные инструменты

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

Основные подходы к управлению версиями PHP

Как обеспечить независимое окружение для каждого проекта с разными требованиями к PHP?

Наиболее эффективное решение в современной разработке – использование Docker. Контейнеризация позволяет изолировать версию PHP, его расширения и настройки для каждого проекта, исключая конфликты между зависимостями. Пример базовой конфигурации для двух версий PHP с Nginx:


# docker-compose.yml
version: '3.8'
services:
  php74:
    image: php:7.4-fpm
    container_name: php74
    volumes:
      - ./project74:/var/www/html
    ports:
      - "9001:9000"

  php81:
    image: php:8.1-fpm
    container_name: php81
    volumes:
      - ./project81:/var/www/html
    ports:
      - "9002:9000"

  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
      - "8081:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./project74:/var/www/html/project74
      - ./project81:/var/www/html/project81

управление версиями php (управление версиями php)

Для каждого проекта создается отдельный конфиг Nginx, который указывает на соответствующий сокет PHP-FPM. Переключение между версиями происходит на уровне запущенных контейнеров – достаточно изменить используемый контейнер в настройках веб-сервера.

Типичная проблема: конфликт портов при одновременном запуске нескольких контейнеров PHP-FPM. Решение – пробрасывать разные внешние порты (9001, 9002 и т.д.).

Другая проблема – медленная пересборка контейнера при изменении версии. Рекомендуется заранее подготовить образы с нужными расширениями через Dockerfile, кэшируя слои.

Как установить несколько версий PHP на одной системе без Docker?

Инструмент phpbrew позволяет собирать и переключать версии PHP из командной строки. Установка и базовое использование:


# Установка phpbrew
curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
chmod +x phpbrew.phar
sudo mv phpbrew.phar /usr/local/bin/phpbrew

# Инициализация и установка PHP 7.4
phpbrew init
phpbrew install 7.4.33 +default +mysql +openssl

# Переключение на версию
phpbrew switch 7.4.33
php -v   # покажет 7.4.33

Ошибка: сборка может завершиться неудачей из-за отсутствия системных зависимостей (libxml2, libssl, readline). Решение – установить необходимые пакеты через менеджер пакетов (apt, yum).

Как использовать phpenv для управления версиями PHP?

phpenv – аналог rbenv для Ruby. Он управляет версиями через подстановку в PATH. Установка:


git clone https://github.com/phpenv/phpenv.git ~/.phpenv
echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(phpenv init -)"' >> ~/.bashrc
exec $SHELL

Для установки конкретной версии используется плагин php-build:


git clone https://github.com/php-build/php-build.git ~/.phpenv/plugins/php-build
phpenv install 8.1.0
phpenv global 8.1.0
php -v

Проблема: phpenv часто требует предварительно установленные зависимости для сборки. Рекомендуется использовать php-build с уже готовыми бинарными пакетами, если они доступны.

Как переключать версию PHP в Debian/Ubuntu через штатные средства?

Системный инструмент update-alternatives позволяет выбирать версию PHP, установленную из репозиториев (например, из PPA). Добавление альтернатив:


sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
sudo update-alternatives --config php

После выбора нужной версии она становится активной глобально.

Ограничение: этот метод работает только для версий, установленных через пакетный менеджер. Для нестандартных сборок потребуется другой подход.

Как полностью контролировать параметры сборки PHP?

Ручная компиляция из исходного кода дает максимальный контроль. Пошаговая инструкция для PHP 8.1:


# Скачивание и распаковка
wget https://www.php.net/distributions/php-8.1.0.tar.gz
tar xzf php-8.1.0.tar.gz
cd php-8.1.0

# Конфигурация с нужными опциями
./configure --prefix=/usr/local/php8.1 \
    --with-openssl --with-mysqli --enable-mbstring \
    --with-curl --with-zlib

# Сборка и установка
make -j$(nproc)
sudo make install

# Создание симлинка для быстрого доступа
sudo ln -s /usr/local/php8.1/bin/php /usr/local/bin/php8.1

Далее можно настроить alias или использовать полный путь.

Сложность: требуется время на сборку, а также умение разбираться в опциях configure. Часто возникают ошибки из-за отсутствия заголовочных файлов (например, libcurl-dev).

Расширенные примеры управления версиями PHP

Ниже приведены подробные сценарии с реальными командами и выводами для каждого подхода.

Пример 1: Docker с разными версиями PHP и Nginx

Создадим проект с двумя версиями PHP (7.4 и 8.1), доступными через разные порты.

Пример

# Структура проекта
mkdir -p php-demo/{project74,project81,nginx/conf.d}

# Файл index.php для каждой версии
echo '<?php phpinfo();' > php-demo/project74/index.php
echo '<?php phpinfo();' > php-demo/project81/index.php

# Конфиг Nginx для версии 7.4 (default.conf)
cat > php-demo/nginx/conf.d/php74.conf <<EOF
server {
    listen 80;
    server_name localhost;
    root /var/www/html/project74;
    index index.php;
    location ~ \.php$ {
        fastcgi_pass php74:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

# Аналогичный конфиг для 8.1 (php81.conf) с fastcgi_pass php81:9000

# docker-compose.yml (см. content)
docker-compose up -d

Проверка:

curl http://localhost:8080/index.php   # страница PHP 7.4
curl http://localhost:8081/index.php   # страница PHP 8.1

Пример 2: phpbrew с дополнительными опциями

Установка PHP 7.4 с поддержкой MySQL и Xdebug:

Пример

phpbrew install 7.4.33 +default +mysql +openssl +xdebug
phpbrew switch 7.4.33
phpbrew ext install xdebug  # если не собралось с расширением
php -m | grep xdebug        # проверка

Вывод после переключения:

PHP 7.4.33 (cli) (built: Sep 15 2023 10:30:00)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2023, by Derick Rethans

Пример 3: phpenv с php-build и пользовательскими настройками

Установка PHP 8.2 с дополнительными опциями через определение переменных:

Пример

export PHP_BUILD_CONFIGURE_OPTS="--with-openssl --with-pdo-mysql"
phpenv install 8.2.0
phpenv local 8.2.0   # локальная версия для каталога
echo 'extension=mysqli' >> ~/.phpenv/versions/8.2.0/etc/php.ini
php -i | grep 'Loaded Configuration File'

Результат:

Loaded Configuration File => /home/user/.phpenv/versions/8.2.0/etc/php.ini

Пример 4: update-alternatives с расширенной настройкой

Добавление не только php, но и phpize, php-config:

Пример

sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize7.4 74
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.1 81
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config7.4 74
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.1 81

# Интерактивный выбор
sudo update-alternatives --config php

Пример 5: Ручная компиляция с оптимизацией

Сборка PHP 8.1 с включением JIT и специфическими расширениями:

Пример

./configure --prefix=/opt/php8.1 \
    --enable-jit=on \
    --enable-opcache \
    --with-openssl=/usr/local/ssl \
    --with-pdo-mysql=mysqlnd \
    --with-mysqli=mysqlnd \
    --with-curl \
    --enable-mbstring \
    --enable-gd --with-freetype
make -j$(nproc)
sudo make install

# Проверка JIT
/opt/php8.1/bin/php -i | grep 'JIT'

Вывод:

JIT => On
JIT buffer size => 0M
JIT trigger => default

Каждый из этих подходов имеет свои сценарии использования. Docker рекомендуется для изолированных окружений и CI/CD, phpbrew и phpenv – для локальной разработки на одной машине, update-alternatives – для быстрых глобальных переключений в стабильных системах, а ручная компиляция – для deep customization.

Управление версиями PHP - comments

En
управление версиями php (php)