Вопрос или проблема
Для моих нужд необходимо установить PHP 7.4
(и модуль для Apache2), вместо последней версии PHP 8.x
.
Поэтому я запускаю следующую команду: apt-get install -y php7.4 libapache2-mod-php7.4
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'libapache2-mod-php7.4' for regex 'php7.4'
Note, selecting 'php7.4-fpm' for regex 'php7.4'
Note, selecting 'php7.4-common' for regex 'php7.4'
The following additional packages will be installed:
libapache2-mod-php libapache2-mod-php8.1 php-common php8.1-cli php8.1-common php8.1-opcache php8.1-readline
Suggested packages:
php-pear
The following NEW packages will be installed:
libapache2-mod-php libapache2-mod-php7.4 libapache2-mod-php8.1 php-common php8.1-cli php8.1-common php8.1-opcache php8.1-readline
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Need to get 840 B/5193 kB of archives.
After this operation, 21.9 MB of additional disk space will be used.
Get:1 http://eu-frankfurt-1-ad-3.clouds.ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 libapache2-mod-php7.4 arm64 8.1.2-1ubuntu2.2 [840 B]
Fetched 840 B in 0s (23.5 kB/s)
Selecting previously unselected package php-common.
(Reading database ... 114642 files and directories currently installed.)
Preparing to unpack .../0-php-common_2%3a92ubuntu1_all.deb ...
Unpacking php-common (2:92ubuntu1) ...
Selecting previously unselected package php8.1-common.
Preparing to unpack .../1-php8.1-common_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking php8.1-common (8.1.2-1ubuntu2.2) ...
Selecting previously unselected package php8.1-opcache.
Preparing to unpack .../2-php8.1-opcache_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking php8.1-opcache (8.1.2-1ubuntu2.2) ...
Selecting previously unselected package php8.1-readline.
Preparing to unpack .../3-php8.1-readline_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking php8.1-readline (8.1.2-1ubuntu2.2) ...
Selecting previously unselected package php8.1-cli.
Preparing to unpack .../4-php8.1-cli_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking php8.1-cli (8.1.2-1ubuntu2.2) ...
Selecting previously unselected package libapache2-mod-php8.1.
Preparing to unpack .../5-libapache2-mod-php8.1_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking libapache2-mod-php8.1 (8.1.2-1ubuntu2.2) ...
Selecting previously unselected package libapache2-mod-php.
Preparing to unpack .../6-libapache2-mod-php_2%3a8.1+92ubuntu1_all.deb ...
Unpacking libapache2-mod-php (2:8.1+92ubuntu1) ...
Selecting previously unselected package libapache2-mod-php7.4.
Preparing to unpack .../7-libapache2-mod-php7.4_8.1.2-1ubuntu2.2_arm64.deb ...
Unpacking libapache2-mod-php7.4 (8.1.2-1ubuntu2.2) ...
Setting up php-common (2:92ubuntu1) ...
Setting up php8.1-common (8.1.2-1ubuntu2.2) ...
Setting up php8.1-readline (8.1.2-1ubuntu2.2) ...
Setting up php8.1-opcache (8.1.2-1ubuntu2.2) ...
Setting up php8.1-cli (8.1.2-1ubuntu2.2) ...
update-alternatives: using /usr/bin/php8.1 to provide /usr/bin/php (php) in auto mode
update-alternatives: using /usr/bin/phar8.1 to provide /usr/bin/phar (phar) in auto mode
update-alternatives: using /usr/bin/phar.phar8.1 to provide /usr/bin/phar.phar (phar.phar) in auto mode
Setting up libapache2-mod-php8.1 (8.1.2-1ubuntu2.2) ...
apache2_invoke: Enable module php8.1
Setting up libapache2-mod-php7.4 (8.1.2-1ubuntu2.2) ...
Setting up libapache2-mod-php (2:8.1+92ubuntu1) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for php8.1-cli (8.1.2-1ubuntu2.2) ...
Processing triggers for libapache2-mod-php8.1 (8.1.2-1ubuntu2.2) ...
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
но когда я проверил, какая версия PHP установлена с помощью php --version
, я получил следующее:
PHP 8.1.2 (cli) (built: Jul 21 2022 12:10:37) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies
Вопрос
Почему я получил PHP 8.1.2
, хотя я явно попытался установить PHP 7.4
? Как я могу установить PHP 7.4
без следов PHP 8.x
?
Не на 100% уверен, но похоже, вы не указываете точное имя пакета…
Я предлагаю найти имя пакета с помощью команды apt-cache policy php7.4*
Также вы можете посмотреть apt list |grep php7.4
для модулей, которые вы можете захотеть добавить (в вашем случае, думаю, уже все в порядке).
С учетом всего этого, я бы сказал, что ваша финальная команда установки должна быть:
sudo apt-get install -y php7.4-common libapache2-mod-php7.4
В любом случае, если обе версии все еще устанавливаются, sudo update-alternative --config php
должно помочь вам с этим разобраться.
В каталоге, где вы хотите php7.4, создайте файл .htaccess и добавьте в него следующее:
<FilesMatch "\.(php4|php5|php3|php2|php|phtml)$">
AddHandler application/x-httpd-php74 .php
</FilesMatch>
Обычно лучше оставлять последнюю версию php для работы на всём сервере и добавлять особые случаи только для каждого поддомена, каталога или любого файла, который вы используете.
.
Ответ или решение
Конечно, давайте разберемся в возникшей ситуации с установкой PHP. Основными причинами того, почему у вас установился PHP 8.1.2 вместо указанного PHP 7.4, могут быть несколько факторов, связанных с управлением пакетами и репозиториями в Ubuntu.
Теоретическая часть (Theory)
Репозитории и пакеты в Ubuntu: В современных дистрибутивах Linux, таких как Ubuntu, установка программного обеспечения осуществляется через систему управления пакетами apt, которая при установке программ проверяет доступные пакеты в репозиториях и всегда стремится установить самую новую, стабильную и подходящую версию программ в соответствии с зависимостями.
Доступность версий: Не все версии программного обеспечения всегда доступны через стандартные репозитории. Часто для более старых версий, таких как PHP 7.4, требуются дополнительные источники пакетов, например PPA (Personal Package Archives).
Зависимости пакетов: apt также может автоматически устанавливать пакеты, необходимые для нормального функционирования основной программы. В данном случае, возможно, некоторые зависимости требовали установки PHP 8.1, поэтому система приняла решение установить его.
Пример (Example)
В описанной вами ситуации был заблаговременно деактивирован выбор версии PHP 7.4, что можно заметить в процессе установки:
-
Из вышеприведенного вывода видно, что команда
apt-get install -y php7.4 libapache2-mod-php7.4
фактически не устанавливала сами пакеты PHP 7.4, а выбирала "подстановку" под такую версию, и в результате в систему был установлен некоторый другой пакет, поддерживающий PHP 8.1, с соответствующими зависимостями. -
Команда
update-alternatives
, которая обновила выбор системного PHP к версии 8.1, показывает, что данная версия на тот момент была зарегистрирована, как самая актуальная в вашем дистрибутиве, что и отразилось в автоматическом предоставлении пути к бинарному файлу PHP 8.1.
Применение (Application)
Шаги для установки PHP 7.4:
-
Добавление репозитория: Для правильной установки PHP 7.4 необходимо подключить репозиторий, который предоставляет более старые версии PHP. Обычно для этого используется репозиторий "ondrej/php", который поддерживает различные версии PHP.
sudo add-apt-repository ppa:ondrej/php sudo apt-get update
-
Чистая установка: Далее рекомендуется удалить все следы текущих версий PHP, чтобы избежать конфликтов.
sudo apt-get purge 'php*'
-
Установка нужной версии: После очистки системы от старых версий PHP можно приступить к установке необходимой версии PHP 7.4:
sudo apt-get install php7.4 php7.4-cli php7.4-common php7.4-fpm php7.4-mbstring php7.4-xml libapache2-mod-php7.4
-
Конфигурация Apache: Обновление конфигурации Apache для работы с PHP 7.4.
sudo a2dismod php8.1 sudo a2enmod php7.4 sudo systemctl restart apache2
-
Управление альтернативами: Специальными инструментами, такими как
update-alternatives
, можно управлять системными путями к различным версиям PHP, чтобы контролировать, какая версия используется по умолчанию.sudo update-alternatives --set php /usr/bin/php7.4
-
Проверка версии: После повторной установки и конфигурации, убедитесь, что используется правильная версия PHP.
php --version
Заключение
Для того, чтобы гарантировать корректную установку нужной версии PHP, важно понять и контролировать процесс управления пакетами, использование репозиториев и зависимостей. Правильная конфигурация системы позволит избежать конфликта различных версий программного обеспечения и обеспечить стабильную работу веб-сервера. Если все рекомендации правильно применены, то PHP 7.4 будет успешно установлен и использован в вашей системе.