Выбор и настройка 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
Выбор версии из предложенного списка.