Выбор и настройка PHP для Debian 13: от стандартных пакетов до кастомной сборки

Раздел: Системное администрирование -> Администрирование сервера

Методы установки PHP на Debian 13

Как установить актуальную версию PHP 8.3 или 8.4 с помощью стороннего репозитория?

Наиболее эффективным решением для установки PHP на Debian 13 является подключение репозитория Ondřej Surý, который предоставляет свежие версии PHP для всех поддерживаемых выпусков Debian. Этот способ обеспечивает простоту обновлений и широкий выбор модулей.

Пошаговая инструкция

1. Установка необходимых пакетов для работы с HTTPS и GPG:

apt update && apt install -y apt-transport-https ca-certificates curl gnupg

2. Импорт GPG-ключа репозитория:

curl -sSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/sury-php.gpg

3. Добавление репозитория в список источников (файл /etc/apt/sources.list.d/php.list):

echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ bookworm main" > /etc/apt/sources.list.d/php.list

Примечание:

Debian 13 (Trixie) на момент написания не вышел стабильно, но репозиторий Surý поддерживает testing/unstable. Вместо bookworm можно указать trixie после его релиза. Для текущей testing ветки используйте bookworm (совместимость обеспечена).

4. Обновление списка пакетов и установка PHP 8.3 вместе с популярными модулями:

apt update && apt install -y php8.3 php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring

5. Проверка установленной версии:

php -v
PHP 8.3.15 (cli) (built: Jan 15 2025 10:00:00) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.3.15, Copyright (c) Zend Technologies

Подобным образом устанавливаются версии PHP 8.2, 8.1, 8.0 и другие, доступные в репозитории.

Типичные ошибки и их устранение

Ошибка GPG: сообщение NO_PUBKEY при выполнении apt update. Решение: повторно импортировать ключ с ключевым сервером:

gpg --keyserver keyserver.ubuntu.com --recv-keys [номер ключа] && gpg --export [номер] | tee /usr/share/keyrings/sury-php.gpg

Конфликт пакетов: если уже установлен PHP из официального репозитория Debian, может возникнуть конфликт зависимостей. Рекомендуется удалить все стандартные пакеты PHP перед подключением стороннего репозитория:

apt purge 'php*' && apt autoremove

Как установить PHP, входящий в состав Debian 13 (официальный репозиторий)?

Официальный репозиторий Debian 13 будет включать несколько стабильных версий PHP (вероятно 8.2 и 8.3). Этот вариант подходит, если нет необходимости в самых новых версиях, а нужна только проверенная совместимость с системными пакетами.

apt update && apt install -y php php-cli php-fpm php-mysql php-xml

Команда установит версию, выбранную по умолчанию в дистрибутиве (например PHP 8.3).

Просмотр доступных версий (до выхода Debian 13 команда может не работать):

apt list 'php[0-9]' 2>/dev/null | grep php | head -10

Проблема: выбор версии ограничен - нельзя установить PHP 8.4, если она не вошла в репозиторий. Также обновления PHP могут запаздывать на месяцы.

Решение: если нужна конкретная устаревшая версия (например PHP 7.4), официальный репозиторий её не содержит; придётся использовать сторонние источники или компиляцию.

Как изолировать версию PHP с помощью Docker?

Docker позволяет запускать PHP в контейнере, не влияя на основную систему. Удобно для разработки или тестирования разных версий одновременно.

Запуск контейнера с PHP 8.3 и подключением текущей директории как корня веб-сервера:

docker run -d --name php83 -v "$PWD":/var/www/html -p 8080:80 php:8.3-apache

Для версии 7.4:

docker run -d --name php74 -v "$PWD":/var/www/html -p 8081:80 php:7.4-apache

Проверка работы через браузер или консоль:

curl http://localhost:8080/info.php

Проблема: контейнеры потребляют ресурсы и при большом количестве могут усложнить управление. Также для продакшна требуется настройка томов и сети.

Решение: использовать Docker Compose для оркестрации нескольких сервисов (nginx + php-fpm).

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

Компиляция из исходников даёт полный контроль над опциями и оптимизациями, подходит для встраиваемых систем или специфических требований.

1. Установка базовых зависимостей для сборки:

apt build-dep php8.3

2. Загрузка исходников нужной версии (например PHP 8.4.0):

cd /usr/local/src && wget https://www.php.net/distributions/php-8.4.0.tar.gz && tar xzf php-8.4.0.tar.gz && cd php-8.4.0

3. Конфигурация с поддержкой часто используемых модулей:

./configure --prefix=/usr/local/php8.4 --enable-fpm --with-mysqli --with-openssl --with-zlib --enable-mbstring --with-curl

4. Сборка и установка:

make -j$(nproc) && make install

5. Создание симлинков для удобного использования:

ln -s /usr/local/php8.4/bin/php /usr/local/bin/php8.4

Ошибка: отсутствие библиотек (например libxml2-dev, libsqlite3-dev). Решение: установить все рекомендованные пакеты с помощью apt build-dep или вручную.

Проблема: при повторной компиляции может возникнуть конфликт с уже установленной версией. Рекомендуется указывать уникальный --prefix.

Как переключаться между множеством версий PHP с помощью phpenv?

Инструмент phpenv (аналог rbenv для Ruby) позволяет локально управлять несколькими версиями PHP, не трогая системный интерпретатор.

Установка phpenv через git (системные зависимости такие же, как для компиляции):

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

Установка плагина php-build:

git clone https://github.com/php-build/php-build.git ~/.phpenv/plugins/php-build

Сборка и установка PHP 8.3:

phpenv install 8.3.15

Активация версии глобально:

phpenv global 8.3.15

Проверка:

php -v

Проблема: сборка через phpenv может занимать много времени и требовать значительных ресурсов. Также возможны ошибки при отсутствии необходимых библиотек.

Решение: использовать предварительно настроенные builder-скрипты или копировать установленные версии из Docker-образов.

Расширенные примеры настройки и использования PHP на Debian 13

Пример 1: Установка PHP 8.4 с поддержкой JIT из репозитория Surý и настройка php.ini

После подключения репозитория Surý (как в основном решении) установка PHP 8.4 и включение JIT:

Пример
apt install -y php8.4 php8.4-cli php8.4-fpm
sed -i 's/;opcache.enable=1/opcache.enable=1/' /etc/php/8.4/cli/php.ini
sed -i 's/;opcache.jit=123/opcache.jit=123/' /etc/php/8.4/cli/php.ini
systemctl restart php8.4-fpm

Проверка JIT через скрипт:

Пример
echo -e "<?\nphpinfo();" > /tmp/info.php && php /tmp/info.php | grep -i jit
JIT Support => Enabled
JIT Buffer Size => 0
JIT Profiling => Disabled

Пример 2: Одновременная работа двух версий PHP-FPM на разных сокетах

Допустим, установлены PHP 8.2 и 8.3. Настройка пулов с разными портами.

Для PHP 8.2 (файл /etc/php/8.2/fpm/pool.d/www.conf):

Пример
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data

Для PHP 8.3:

Пример
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data

Настройка Nginx для проксирования запросов на разные версии:

Пример
server {
    listen 80;
    server_name site1.local;
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        include fastcgi_params;
    }
}
server {
    listen 80;
    server_name site2.local;
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        include fastcgi_params;
    }
}

Перезапуск сервисов:

Пример
systemctl restart php8.2-fpm php8.3-fpm nginx

Пример 3: Использование Docker Compose для окружения с PHP 7.4 и MySQL

Создание файла docker-compose.yml:

Пример
version: '3'
services:
  php:
    image: php:7.4-apache
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pass
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: test
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
    ports:
      - "3306:3306"

Запуск:

Пример
docker-compose up -d

Проверка подключения к MySQL из PHP (файл www/test.php):

Пример
<?php
$conn = new mysqli('db', 'user', 'pass', 'test');
if ($conn->connect_error) {
    die('Ошибка: ' . $conn->connect_error);
} else {
    echo 'Подключение успешно';
}
?>
Подключение успешно

Пример 4: Компиляция PHP с дополнительными модулями (GD, Imagick)

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

Пример
apt install -y libgd-dev libmagickwand-dev

Затем при конфигурации:

Пример
./configure --prefix=/usr/local/php-custom --enable-gd --with-webp --with-jpeg --with-freetype --with-imagick=/usr

После сборки проверить наличие модулей:

Пример
/usr/local/php-custom/bin/php -m | grep -E 'gd|imagick'
gd
imagick

Пример 5: Создание симлинков и управление версиями через update-alternatives

После установки нескольких версий из репозитория Surý (например 8.2, 8.3) можно настроить системную команду php для вызова нужной версии:

Пример
update-alternatives --install /usr/bin/php php /usr/bin/php8.3 83
update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.3 83
update-alternatives --config php

Выбор версии из предложенного списка.

Установка PHP версии Debian 13 - comments

En
Php debian 13 (php)