我们需要在 Ubuntu 16.04 服务器上安装 PHP5.3 来替换我们即将替换的旧版第三方应用程序,但我们仍需要等待一段时间。
因此,我使用 FPM 编译了 PHP5.3.29,使其能够与我们的 Nginx Stack 配合使用。但是,我在将 OpenSSL 编译到 PHP 中时遇到了困难。所以,以下是我目前所做的工作:
使用系统安装的 OpenSSL (v 1.0.1j)
尝试编译 PHP--with-openssl
时运行 make 失败并出现以下错误:
/usr/bin/ld: ext/openssl/openssl.o: undefined reference to symbol 'SSL_get_verify_result@@OPENSSL_1.0.0'
//lib/x86_64-linux-gnu/libssl.so.1.0.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:267: recipe for target 'sapi/fpm/php-fpm' failed
因此我在网上搜索了此错误的修复方法,但找到的方法都没有成功。不过,我看到的一篇帖子提到,使用旧版本的 OpenSSL 可以解决这个问题。所以我就尝试了。
使用自编译的旧版本 OpenSSL (v 0.9.8w)
我使用该标志编译了 OpenSSL,--prefix=/opt/openssl
以确保它不会干扰 OpenSSL 的系统安装。之后,我尝试再次使用编译 PHP --with-openssl=/opt/openssl
,一切顺利。
但是,在使用需要 PHP 5.3 的应用程序运行一些测试后,我很快发现在使用带有 https url 的 cURL-Requests 时,为我的请求提供服务的 FPM-Child 出现分段错误。因此,我调试了出现故障的子进程,并能够将原因追溯到 OpenSSL。好的 - 现在该怎么办?
完全不使用 OpenSSL 来编译 PHP
因此,我决定完全省略 OpenSSL 扩展,实际上成功编译了(这并不奇怪),并且使用我刚刚编译的 PHP 安装通过 curl 请求了 https url。我以为一切都很好,但事实并非如此(也不奇怪):运行应用程序一段时间后,发现它大量使用了file_get_contents()
与 https url 结合的调用。这些都失败了,因为 PHP 缺少 https 流支持,因为缺少 OpenSSL 扩展。
所以我不知道下一步该做什么,我希望你能给我指明正确的方向。
仅供参考,这是我用于编译的配置(--with-openssl 参数的值不同):
./configure \
--prefix=/usr/local/php5.3 \
--with-config-file-path=/etc/php/5.3 \
--with-mysql \
--with-mysqli=mysqlnd \
--with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \
--with-png-dir=/usr \
--with-gd \
--enable-soap \
--enable-bcmath \
--enable-mbstring \
--with-curl \
--with-openssl=/opt/openssl
--with-zlib=/usr \
--enable-ftp \
--enable-zip \
--with-mcrypt \
--enable-pdo --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd \
--enable-fpm
非常感谢!
答案1
以下是我执行此操作时的笔记:
步骤1- 构建 php - 在你解压 php 的地方执行(可能是 [homedir]/software/php5329),这样它就可以安装到 [homedir]/usr/php5329
· PHP 构建编译配置 - ./configure --prefix=[homedir]/usr/php5329 --with-snmp --with-mysql=/usr/phab/mysql/bin --with-libdir=lib64 --with-pdo-mysql=/usr/phab/mysql/ --with-pear=[homedir]/usr/php5329 --with-config-file-path=[homedir]/usr/php5329; make clean ; make -j 32 ; make install
第2步- 构建 libssh - 在您解压 libssh-1.7.0 的位置执行(可能是 [homedir]/software/libssh-1.7.0),以便它可以安装到 [homedir]/usr/libssh2
· Libssh2 - ./configure --prefix=[homedir]/usr/libssh2-1.7.0 ; make clean ; make -j 50 ; make install
步骤3- 设置 php-ssl 桥接器,其源位于 [homedir]/software/ssh-0.12
· PHP-SSL 桥接器 - phpize534;./configure --with-ssh2=[homedir]/usr/libssh2-1.7.0 --with-php-config=[path to new php-config]/php-config ; make clean ; make -j 50 ; make install