Назад | Перейти на главную страницу

Сбой компиляции PHP 5.3.29 с OpenSSL

нам нужна установка PHP5.3 на нашем сервере Ubuntu 16.04 для устаревшего стороннего приложения, которое мы собираемся заменить, но нам все еще нужно какое-то время.

Поэтому я скомпилировал PHP5.3.29 с FPM, чтобы заставить его работать с нашим стеком Nginx. Однако мне сложно компилировать 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, я быстро начал видеть FPM-Child, который обслуживал мой запрос segfaulting при использовании cURL-запросов с URL-адресами https. Итак, я отладил неисправный дочерний элемент и смог отследить причину до OpenSSL. ОК - что теперь делать?

Компиляция PHP без OpenSSL вообще

Поэтому я решил полностью опустить расширение OpenSSL и на самом деле добился успеха как в компиляции (неудивительно), так и в запросе URL-адресов https через curl с использованием только что скомпилированной установки PHP. Я подумал, что все хорошо, но это не так (тоже неудивительно): после некоторого запуска приложения выяснилось, что оно широко использует file_get_contents() звонки в сочетании с URL-адресами https. Все они терпят неудачу, потому что 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 - build 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 - build 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