16
juin
2023
15:42

Как установить PHP 7.0, PHP 7.1, PHP 7.2, PHP 7.3 или PHP 7.4 в Ubuntu 22.04 "Jammy Jellyfish" или Linux Mint 21.1 "Vera" и переключить версию

16 juin 2023 15:42

В новой версии Ubuntu 22.04 установка из репозитория ondrej старых версий PHP связана с трудностями.

Предыстория

Хотел установить выполнить понижение версии PHP с 8.1 на PHP 7.4, но оказалось непросто на свежей версии Ubuntu "jammy" (Linux Mint "Vera").
В последних версиях ставится исключительно PHP 8.1, при поиске apt-cache search php7 ничего не находится.

Добавление репозиториев разработчика, я выполнил по инструкции команду:

sudo add-apt-repository ppa:ondrej/apache2

sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php

ошибка
gpg: сбой при получении с сервера ключей: Недопустимый URI

При выполнении

sudo apt update

Выдавались ошибки:

W: Ошибка GPG: https://ppa.launchpadcontent.net/ondrej/apache2/ubuntu jammy InRelease: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY 4F4EA0AAE5267A6C
E: Репозиторий «https://ppa.launchpadcontent.net/ondrej/apache2/ubuntu jammy InRelease» не подписан.

W: Ошибка GPG: https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy InRelease: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY 4F4EA0AAE5267A6C
E: Репозиторий «https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy InRelease» не подписан.

Попытался добавить в систему ключ подписи при помощи команд, но ошибка сохранилась:

gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 4F4EA0AAE5267A6C
gpg --export 4F4EA0AAE5267A6C | sudo tee /etc/apt/trusted.gpg.d/php_ondrej.gpg > /dev/null

Но команда apt update выдавала ошибку, так как оба репозитория ondrej оказались отключены в системе, т.к. не подписаны. Файла связки ключей gpg для репозитория oandrej я не нашёл в Интернет. Соответственно, выполнить команду sudo gpg --import имя_файла.gpg не представилось возможным.

Связка ключей, которая находится в конце страницы https://www.php.net/gpg-keys.php не помогла (sudo sudo gpg --import php-keyring.gpg), т.е. в файле gpg оказались ключи других разработчиков.

Решение

Надо открыть на редактирование файлы в каталоге sources:

cd /etc/apt/sources.list.d

Смотрим, что есть

 ls ondrej*

Результат:

ondrej-apache2-jammy.list ondrej-php-bionic.list ondrej-php-jammy.list

По очереди открываем файлы ondrej*.list на изменение в редакторе nano:

1) репозиторий ondrej для веб-сервера Apache2

sudo nano ondrej-apache2-jammy.list

исправляем первую строку, убирая текст, касающийся подписи.

Было:
deb [arch=amd64 signed-by=/etc/apt/keyrings/ondrej-apache2-jammy.gpg] https://ppa.launchpadcontent.net/ondrej/apache2/ubuntu jammy main

Стало:
deb https://ppa.launchpadcontent.net/ondrej/apache2/ubuntu jammy main

2) репозиторий ondrej для версий PHP

sudo nano ondrej-php-jammy.list

Было:
deb [arch=amd64 signed-by=/etc/apt/keyrings/ondrej-php-jammy.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main

Стало:
deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main

Результат

sudo apt update

Ошибок нет (на предупреждение " Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details." не обращаем внимания)

Теперь можно устанавливать PHP 7.4:

sudo apt install php7.4
sudo apt install php7.4-{cli,common,curl,zip,gd,mysql,xml,mbstring,json,intl}

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

php --version

PHP 8.1.2-1ubuntu2.11 (cli) (built: Feb 22 2023 22:56:18) (NTS)

Переключение PHP в системе производится командой

sudo update-alternatives --config php

Есть 3 варианта для альтернативы php (предоставляет /usr/bin/php).

Выбор Путь Приор Состояние

  • 0 /usr/bin/php.default 100 автоматический режим
    1 /usr/bin/php.default 100 ручной режим
    2 /usr/bin/php7.4 74 ручной режим
    3 /usr/bin/php8.1 81 ручной режим

Нажмите «enter», чтобы не менять текущий выбор[*], или введите нужное число:

При нажатии 2 интерпретатор PHP переключится на версию 7.4.

php --version

PHP 7.4.33 (cli) (built: Jun 8 2023 15:23:32) ( NTS )

Другой способ переключения php командами:

8.1 -> 7.4

sudo update-alternatives --set php /usr/bin/php7.4

7.4 -> 8.1

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

Переключение PHP в веб-сервере Apache2

Дополнение от 07.2023: Модуль PHP 7.4 для Apache2 нужно установить заранее:

sudo apt-get install libapache2-mod-php7.4

8.1 -> 7.4

sudo a2dismod php8.1
sudo a2enmod php7.4

7.4 -> 8.1

sudo a2dismod php7.4
sudo a2enmod php8.1    

Проверка

Создадим простейший файл test.php и откроем его из адресной строки браузера с веб сервера:

<?php echo phpinfo(); ?>

При открытии URL должна быть получен вывод функции phpinfo().
В строке "Configuration file (PHP.INI) path" в полном пути к файлу php.ini будет выведена текущая используемая интерпретатором версия PHP, например, 7.4.

Отключение FastCGI

Наличие запущенного модуля FPM версии PHP 8.1 можно проверить командой из консоли:

sudo systemctl status php8.1-fpm

В моём случае FPM запущен и использует PHP 8.1 (игнорируя версию модуля php7.4 в Apache2):

php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-07-04 09:01:29 MSK; 38min ago
       Docs: man:php-fpm8.1(8)
    Process: 1411 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/8.1/fpm/pool.d/www.conf 81>
   Main PID: 1207 (php-fpm8.1)
     Status: "Processes active: 0, idle: 2, Requests: 2, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 3408)
     Memory: 23.7M
        CPU: 254ms
     CGroup: /system.slice/php8.1-fpm.service
             ├─1207 "php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             ├─1409 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             └─1410 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Также, при использовании FastCGI (PHP-FPM) использование ошибочной версии 8.1 видно по команде echo phpinfo();.
Чтобы версия стала 7.4, я отключил модуль php-fpm на тестовом сервере Apache2, командой:

sudo a2dismod actions alias proxy_fcgi setenvif

Затем, подтвердил отключение: "Yes, do as I say!"

Выполнил перезапуск сервера Apache2:

sudo systemctl restart apache2

Теперь phpinfo() показывает нужную мне версию php - 7.4 (вместо 8.1):

Configuration File (php.ini) Path /etc/php/7.4/apache2
Loaded Configuration File (none)
Scan this dir for additional .ini files /etc/php/7.4/apache2/conf.d


_Последнее изменение: 02.06.2025: замена gpg --export --armor 4F4EA0AAE5267A6C | sudo apt-key add -
на gpg --export 4F4EA0AAE5267A6C | sudo tee /etc/apt/trusted.gpg.d/phpondrej.gpg > /dev/null



Publications connexes