PHP 7 在 Ubuntu 14.04 上安装现在由于无法解决的 libssl 依赖关系而失败?

PHP 7 install on Ubuntu 14.04 now fails due to libssl dependency that can't be resolved?

我正在使用 shippable 构建我的项目,其中一部分需要 PHP。

构建脚本是这样的:

apt-get update
apt-get install -y software-properties-common python-software-properties language-pack-en-base
LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
apt-get update
apt-get install -y php7.0 php7.0-bcmath

今天安装 PHP 时构建失败,出现以下错误:

apt-get install -y php7.0 php7.0-bcmath

Reading package lists...
Building dependency tree...
Reading state information...
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 php7.0 : Depends: libapache2-mod-php7.0 but it is not going to be installed or
                   php7.0-fpm but it is not going to be installed or
                   php7.0-cgi but it is not going to be installed
          Depends: php7.0-common but it is not going to be installed
 php7.0-bcmath : Depends: php7.0-common but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

所以我启动了一个本地 docker 容器来查看 shippable 是否发生了奇怪的事情 - 使用以下命令:

docker run -i -t ubuntu:14.04 /bin/bash

和 运行 上面列出的 5 条构建行,我得到了同样的错误。接下来我做的是安装 aptitude 看看我是否能得到更好的错误,并且 运行 这个 aptitude install -y php7.0 php7.0-bcmath - 这是 aptitude 输出:

aptitude install -y php7.0 php7.0-bcmath
The following NEW packages will be installed:
  apache2{a} apache2-bin{a} apache2-data{a} libapache2-mod-php7.0{ab} 
  libapr1{a} libaprutil1{a} libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} 
  libedit2{a} php-common{a} php7.0 php7.0-bcmath php7.0-cli{ab} 
  php7.0-common{ab} php7.0-json{a} php7.0-opcache{a} php7.0-readline{a} 
  psmisc{a} ssl-cert{a} 
0 packages upgraded, 19 newly installed, 0 to remove and 7 not upgraded.
Need to get 4950 kB of archives. After unpacking 20.2 MB will be used.
The following packages have unmet dependencies:
 php7.0-cli : Depends: libssl1.1 (>= 1.1.0) which is a virtual package.
 php7.0-common : Depends: libssl1.1 (>= 1.1.0) which is a virtual package.
 libapache2-mod-php7.0 : Depends: libssl1.1 (>= 1.1.0) which is a virtual package.
The following actions will resolve these dependencies:

     Keep the following packages at their current version:
1)     libapache2-mod-php7.0 [Not Installed]              
2)     php7.0 [Not Installed]                             
3)     php7.0-bcmath [Not Installed]                      
4)     php7.0-cli [Not Installed]                         
5)     php7.0-common [Not Installed]                      
6)     php7.0-json [Not Installed]                        
7)     php7.0-opcache [Not Installed]                     
8)     php7.0-readline [Not Installed]                    



The following NEW packages will be installed:
  psmisc{a} 
0 packages upgraded, 1 newly installed, 0 to remove and 7 not upgraded.
Need to get 53.2 kB of archives. After unpacking 229 kB will be used.
Get: 1 http://archive.ubuntu.com/ubuntu/ trusty/main psmisc amd64 22.20-1ubuntu2 [53.2 kB]
Fetched 53.2 kB in 0s (911 kB/s)
Selecting previously unselected package psmisc.
(Reading database ... 14894 files and directories currently installed.)
Preparing to unpack .../psmisc_22.20-1ubuntu2_amd64.deb ...
Unpacking psmisc (22.20-1ubuntu2) ...
Setting up psmisc (22.20-1ubuntu2) ...

我有几个问题:

1) 我该如何解决这个问题?我已经做了一些查找,但不知道如何更新 libssl

2) 为什么突然出现这种情况,以前PHP7.0 从来都不是问题?

一些附加信息:

openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Jan 30 20:38:38 UTC 2017
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) 
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

uname -a
Linux b5cbe94d7da8 4.9.13-moby #1 SMP Sat Mar 25 02:48:44 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

PPA 维护者有 'fixed' 这个,according to a GitHub issue

回答您的问题:

1) How do i fix this? I have done some looking but can't work out how to update libssl

PPA 已经修复,但下次请在适当的地方填写问题 - 例如issue tracker.

2) Why has this happened all of a sudden, this was never a problem for PHP7.0 before?

ppa:ondrej/php build-depends on ppa:ondrej/apache2 that has been recently updated to OpenSSL 1.1.0 libraries, and those were picked up by latest build of PHP. The ppa:ondrej/php 中的包必须使用 OpenSSL 1.1.0 库进行更新,这也是此举的结果。

偶尔会出现一两个bug,在合适的地方补上bug就修复了。

混合使用多个版本的 OpenSSL 是完全安全的,即使在同一个二进制文件中也是如此,因为 OpenSSL 使用正确的 SONAMEs and all the symbols in the shared library are versioned.