如果我同时安装这两个软件包,请注意,将安装 php7.4:
$ apt install php7.1 php7.1-redis
The following NEW packages will be installed:
apache2 apache2-bin apache2-data apache2-utils ifupdown iproute2 isc-dhcp-client isc-dhcp-common libapache2-mod-php7.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libargon2-0 libatm1 libbsd0 libdns-export162 libedit2
libgdbm3 libisc-export160 liblua5.1-0 libmnl0 libpcre2-8-0 libperl5.22 libsodium23 libssl1.1 libxtables11 netbase perl perl-modules-5.22 php-common php-igbinary php-redis php7.1 php7.1-cli php7.1-common php7.1-json php7.1-opcache
php7.1-readline php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-phpdbg php7.4-readline psmisc rename ssl-cert tzdata
如果我单独安装它们,则不会安装 php7.4:
$ apt install php7.1
The following NEW packages will be installed:
apache2 apache2-bin apache2-data apache2-utils ifupdown iproute2 isc-dhcp-client isc-dhcp-common libapache2-mod-php7.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libatm1 libbsd0 libdns-export162 libedit2 libgdbm3
libisc-export160 liblua5.1-0 libmnl0 libperl5.22 libssl1.1 libxtables11 netbase perl perl-modules-5.22 php-common php7.1 php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-readline psmisc rename ssl-cert tzdata
$ apt install php7.1-redis
The following NEW packages will be installed:
php-igbinary php-redis
为什么?我对 Linux 并不是完全陌生,但我从未注意到这种行为。
要尝试它,你可以使用 docker:
docker run -it --rm ubuntu:16.04 bash
这些软件包需要额外的 ppa,因此:
apt update && apt install -y software-properties-common
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && apt-get update
您已准备出发。
答案1
apt
输出一条容易错过的消息,给出提示:
注意,选择“php-redis”而不是“php7.1-redis”
php7.1-redis
不存在,或者更确切地说,它是由 提供的虚拟包php-redis
。所以apt
改变
apt install php7.1 php7.1-redis
到
apt install php7.1 php-redis
当同时请求两个包时,apt
请考虑它们的所有依赖关系,并且在这种情况下会因其虚拟替代处理而陷入困境。php-redis
依赖于phpapi-20190902 | phpapi-20180731 | phpapi-20170718 | phpapi-20160303 | phpapi-20151012 | phpapi-20131226
,它由许多具体的 PHP 包提供;apt
picks php7.4-cli
,这是按评估顺序排列的第一个满足依赖关系的包。它也解决了php7.1
,但可能因为phpapi
连接不同(PHP 7.4 提供phpapi-20190902
,PHP 7.1 提供phpapi-20160303
),没有意识到php7.1
最终满足php-redis
“依赖关系”。
当php-redis
安装之后php7.1
,phpapi
要求已经满足,所以apt
不再尝试安装任何东西。