Да, правилно прочетохте заглавието. Компилиране на PHP версия 7 под CentOS 5. Преди да стигнем до съществената част, силно ви съветваме да НЕ използвате CentOS 5 вече, защото не се поддържа от 31 Март 2017 година. Причината за тази статия е, защото някои стари сървъри със сайтове разположени на тях искат да бъдат в крак с времето, което е логично и хубаво. Но ви съветваме при всички положения да обмислите upgrade към CentOS 7 или към текуща LTS версия на някоя от major дистрибуциите. На CentOS 6 и 7, upgrade процедурата до PHP 7 става лесно и безпроблемно. При CentOS 5 не е така защото е нужно да бъдат компилирани няколко софтуера ръчно. Пакетите със зависимостите са твърде стари за да тръгне PHP 7, но ние ще разгледаме цялостната процедура от нулата, което включва и самото компилиране на PHP 7.1. Методът на компилация няма да изтрие текущата ви PHP версия, а само ще добави и 7.1.
1. Компилиране на OpenSSL
1. Влезте в сървъра с SSH:
ssh root@yourserver
Тъй като official репотата на CentOS 5 са вече неактивни, е нужно да използвате Vault репото. То все още е активно и съдържа пакети за CentOS 5. Изтрийте стария CentOS-Base.repo файл и го заменете с ново съдържание. Може да направите бекъп на файла преди това, ако желаете:
>/etc/yum.repos.d/CentOS-Base.repo
След което отворете с някой текстов редактор файла и поставете новите repo-та:
vi /etc/yum.repos.d/CentOS-Base.repo
Вашият CentOS-Base.repo файл трябва да изглежда така:
# CentOS-Base.repo
#
# Since official repositories are gone, use vault.centos.org instead.
#
#
[base]
name=CentOS-5 - Base
baseurl=http://vault.centos.org/5.11/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[updates]
name=CentOS-5 - Updates
baseurl=http://vault.centos.org/5.11/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-5 - Extras
baseurl=http://vault.centos.org/5.11/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[centosplus]
name=CentOS-5 - Plus
baseurl=http://vault.centos.org/5.11/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[contrib]
name=CentOS-5 - Contrib
baseurl=http://vault.centos.org/5.11/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
Запазете файла. След това е време да update-нете системата:
yum -y update
Ако вече сте с CentOS 5.11, няма да имате пакети за update. В противен случай, съветваме ви да извършите update на всички възможни пакети през yum.
След като yum update приключи, е време да инсталирате няколко пакета, които ще са нужни за компилирането на OpenSSL, ICU и PHP 7:
yum install gcc gcc-c++ libxml2-devel pkgconfig openssl-devel bzip2-devel curl-devel libpng-devel libjpeg-devel libXpm-devel freetype-devel gmp-devel libmcrypt-devel mariadb-devel aspell-devel recode-devel autoconf bison re2c libicu-devel
И сега е време да пристъпите към компилацията на OpenSSL. Нужно е да използвате по-нова версия от последната пакетирана за CentOS 5. Тя ще бъде 1.0.2o, която е излязла на 27 Март 2018 година (реално след края на CentOS 5.11). Идете в /root директорията и свалете архива, след което го разархивирайте и пристъпете към компилирането му:
cd /root && wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz
tar xvf openssl-1.0.2o.tar.gz && cd openssl-1.0.2o
След като имате всичко свалено и на лице, започнете с компилацията:
./config -fpic shared && make && make install
Ако стъпките до момента са изпълнени както трябва, би трябвало компилацията да приключи успешно. Със следващата команда ще посочите на операционната система къде да търси библиотеки за вашия нов OpenSSL:
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig
Остава само да изместите старото OpenSSL binary и да приложите новото:
mv /usr/bin/openssl /usr/bin/opensslOLD
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
Можете да проверите и версията на новия OpenSSL, за да сте сигурни че binary-то е успешно подменено и всичко работи както се очаква:
openssl version
2. Компилиране на ICU
ICU изисква версия по-нова от 4.0 и вие сте длъжни да спазите това изискване. В противен случай няма да можете да използвате PHP с intl extension-a. Ако смятате, че той не ви е нужен, можете да пропуснете тази стъпка. Ние горещо ви препоръчваме да не го игнорирате.
Ще използваме ICU версия 50. Преди да пристъпите към компилацията е нужно да инсталирате subversion пакета през yum, за да свалите source-a на ICU. Компилирайте го в директория /opt/icu50:
yum install subversion
mkdir /opt/icu50 && cd /root && svn export http://source.icu-project.org/repos/icu/icu/tags/release-50-1-2/
След като сте го свалили, влезте в source директорията му:
cd release-50-1-2/source/
Време е да пристъпите към компилацията. Тук то е значително по-малко от това за OpenSSL:
./configure --prefix=/opt/icu50 && make && make install
След като компилацията приключи, е нужно да кажете на операционната система къде да търси библотеките за новият ICU, както направихте при OpenSSL:
echo /opt/icu50/lib >>/etc/ld.so.conf && ldconfig
С това сте готови да пристъпим към най-съществената част, а именно PHP 7.1.
3. Компилиране на PHP 7.1
Стъпките до този момента бяха от жизнена важност, за да може и тази да приключи успешно. Начина на компилиране ще бъде да се посочи отделна директория за php7.1 и той да бъде разположен там. Смисълът на това е да не премахнете текущото ви PHP от сървъра. Ако не искате да имате две PHP версии на сървъра, винаги може да промените configure опциите според вашите желания и нужди. PHP 7.1 ще бъде обслужван и от собствен php.ini файл. За да може успешно да се компилира на CentOS 5.11 е нужно да се променят няколко параметъра в самия configure файл. За да ви улесним, ние сме направили тези промени за вас и е нужно само да свалите файла и да го подмените в source-a. Другото, което имаме за вас, е готов intl.so файл, който всъщност е intl модула за PHP. Не е нужно да го добавяте в configure опциите, нито да го инсталирате през pecl. Нека да започнем!
Свалете версия 7.1.17 от тук. Тя е последната stable. След като я свалите в разархивирайте:
cd /root && tar xvf php-7.1.17.tar.gz
cd php-7.1.17
Както споменахме по-рано, за да се компилира успешно PHP 7.1, е нужно да се направят няколко промени в configure файла. Ние сме ги направили вместо вас и ви предоставяме цял готов configure файл. Свалете го и го заменете в разархивираната директория:
wget https://blog.delta.bg/blogfiles/configure
След като имате свален и заменен configure файл, е време да пристъпите към инсталацията.
Изпълнете следната команда в разархивираната директория:
./configure --prefix=/opt/php7.1 --with-config-file-path=/opt/php7.1/etc --with-config-file-scan-dir=/opt/php7.1/etc/conf.d --enable-bcmath --with-bz2 --with-curl --enable-filter --with-gd --enable-gd-native-ttf --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-mbstring --with-mcrypt --enable-mysqlnd --with-mysql-sock=/var/lib/mysql/mysql.sock --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pdo-sqlite --disable-phpdbg --disable-phpdbg-webhelper --enable-opcache --with-openssl=/usr/local/ssl --enable-simplexml --with-sqlite3 --enable-xmlreader --enable-xmlwriter --enable-zip --with-zlib
Ако configure е минал успешно, изпълнете make и make install:
make && make install
Това ще отнеме известно време, така че може да си направите едно кафе и дори да го изпиете.
Ако всичко е приключило успешно, можете да тествате дали работи новото PHP със следната команда:
/opt/php7.1/bin/php -v
Това, което остана е intl extension-а. Както споменахме по-рано, за него също имаме готово решение. Ще ви предоставим .so файл, който да разположите в директорията с extension-и:
cd /opt/php7.1/lib/php/extensions/no-debug-non-zts-20160303 && wget https://blog.delta.bg/blogfiles/intl.so
Остана да копирате и php.ini файл, защото към момента такъв няма. Върнете се в source директорията на php7.1 и от там го копирайте:
cp /root/php-7.1.17/php.ini-production /opt/php7.1/etc/php.ini
След като вече имате и php.ini файл, укажете му директория, от която да зарежда extension-ите (в частност intl.so):
echo extension_dir = "/opt/php7.1/lib/php/extensions/no-debug-non-zts-20160303" >> /opt/php7.1/etc/php.ini
echo extension=intl.so >> /opt/php7.1/etc/php.ini
Остана само да тествате дали всички модули се виждат и зареждат. Това може да направите със следната команда:
/opt/php7.1/bin/php -m
Това е! Вече имате PHP 7.1 на CentOS 5!