Содержание
Установка PHP 5.3.29 в CentOS 7 через phpbrew
______ _ _ ____________ | ___ \ | | || ___ \ ___ \ | |_/ / |_| || |_/ / |_/ /_ __ _____ __ | __/| _ || __/| ___ \ '__/ _ \ \ /\ / / | | | | | || | | |_/ / | | __/\ V V / \_| \_| |_/\_| \____/|_| \___| \_/\_/
Что такое phpbrew?
Менеджер версий PHP, который даёт возможность установить несколько версий PHP ничего не сломав.
Автор еретик и не ведает, что делает! 5329 в 2017 году. Пройдите на костёр!
Тоже самое было с версией 5.2.17. К сожалению бывают случаи, когда нужно именно такую версию PHP. Хотя EOL только в 14 году. Ещё можно использовать. Под присмотром. Шутки off. Да, есть php selector'ы в cPanel (CloudLinux), ISPmanager, VestaCP и другие, но исходные данные не позволяют использовать никакую ПУ.
Можно же просто компилировать из src. Зачем нужны эти обёртки?
Можно. Если есть много времени и хочется прокачать немного скилл в Linux. Но phpbrew экономит много времени и не нужно искать нужные ключи --configure-with-bla-bla-1337.
Установка будет произведена в варианте system wide. То есть установка глобальная для ОС (в /opt/phpbrew), а не в домашнем каталоге пользователя.
Подготовка
Вначале требуется установить некоторые пакеты согласно wiki странице Requirement на github. Но я намеренно пропущу этот шаг, так как сдаётся мне далеко не все предлагаемые пакеты мне понадобятся в дальнейшем.
Устанавливаем phpbrew
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew chmod +x phpbrew mv phpbrew /usr/local/bin/phpbrew
Правильная инициализация
phpbrew init --root=/opt/phpbrew
ОШИБКА /usr/bin/env: php: No such file or directory
Для работы phpbrew необходим php-cli и php-common.
# yum install php-cli
phpbrew не создаст сам каталог в /opt
, поэтому надо сделать mkdir /opt/phpbrew
GetOptionKit\InvalidOptionValue: Invalid value for --root. Requires a type Dir. Trace: 0) GetOptionKit\Option->_preprocessValue('/opt/phpbrew') 1) GetOptionKit\Option->setValue('/opt/phpbrew') 2) GetOptionKit\OptionParser->takeOptionValue(* key:root spec:--root=<dir> desc:Override the default PHPBREW_ROOT path setting.This option is usually used to load system-wide build pool. e.g. phpbrew init --root=/opt/phpbrew value => , --root, /opt/phpbrew) 3) GetOptionKit\ContinuousOptionParser->parse(['/usr/local/bin/phpbrew', 'init', '--root=/opt/phpbrew']) 4) GetOptionKit\ContinuousOptionParser->continueParse() 5) CLIFramework\Application->run(['/usr/local/bin/phpbrew', 'init', '--root=/opt/phpbrew']) 6) PhpBrew\Console->runWithTry(['/usr/local/bin/phpbrew', 'init', '--root=/opt/phpbrew']) 7) require('phar:///usr/local/bin/phpbrew/scripts/phpbrew-emb.php')
Успешная инициализация
Using root: /opt/phpbrew Initialization successfully finished! <=====================================================> Phpbrew environment is initialized, required directories are created under /root/.phpbrew Paste the following line(s) to the end of your ~/.bashrc and start a new shell, phpbrew should be up and fully functional from there: source /root/.phpbrew/bashrc To enable PHP version info in your shell prompt, please set PHPBREW_SET_PROMPT=1 in your `~/.bashrc` before you source `~/.phpbrew/bashrc` export PHPBREW_SET_PROMPT=1 To enable .phpbrewrc file searching, please export the following variable: export PHPBREW_RC_ENABLE=1 For further instructions, simply run `phpbrew` to see the help message. Enjoy phpbrew at $HOME!!
Добавляем в ~/.phpbrew/bashrc
export PHPBREW_ROOT=/opt/phpbrew # php dist files and build files are stored here export PHPBREW_HOME=/root/.phpbrew # your configuration files.
Перелогиниваемся или выполняем
source ~/.phpbrew/bashrc
Установка PHP
Смотрим список доступных версий для установки
# phpbrew known ===> Fetching release list... 7.1: 7.1.9, 7.1.8, 7.1.7, 7.1.6, 7.1.5, 7.1.4, 7.1.3, 7.1.2 ... 7.0: 7.0.23, 7.0.22, 7.0.21, 7.0.20, 7.0.19, 7.0.18, 7.0.17, 7.0.16 ... 5.6: 5.6.31, 5.6.30, 5.6.29, 5.6.28, 5.6.27, 5.6.26, 5.6.25, 5.6.24 ... 5.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ... 5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
5.3 в нём нет. И это правильно. Нам нужен дополнительный ключ –old
# phpbrew known --old ===> Fetching release list... 7.1: 7.1.9, 7.1.8, 7.1.7, 7.1.6, 7.1.5, 7.1.4, 7.1.3, 7.1.2 ... ... 5.3: 5.3.29, 5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22 ... 5.2: 5.2.17, 5.2.16, 5.2.15, 5.2.14, 5.2.13, 5.2.12, 5.2.11, 5.2.10 ... 5.1: 5.1.6, 5.1.5, 5.1.4, 5.1.3, 5.1.2, 5.1.1, 5.1.0 ... 5.0: 5.0.5, 5.0.4, 5.0.3, 5.0.2, 5.0.1, 5.0.0 ... phpbrew need php 5.3 or above to run. build/switch to versions below 5.3 at your own risk.
Варианты сборок смотрим так
# phpbrew variants default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc, json, mbregex, mbstring, mhash, mcrypt, pcntl, pcre, pdo, phar, posix, readline, sockets, tokenizer, xml, curl, openssl, zip
# phpbrew -d install 5.3.29 +default -- --with-libdir=lib64
Default сборка завершилась довольно быстро. Недостающие пакеты ставим по мере поступления ошибок (см. Ошибки при компилировании
Build finished: 8.1 minutes. Installing... ---> Creating php-fpm.conf ---> Creating php.ini ---> Copying /opt/phpbrew/build/php-5.3.29/php.ini-development ---> Found date.timezone is not set, patching... ---> Turn off detect_encoding for php 5.3.* Source directory: /opt/phpbrew/build/php-5.3.29 Congratulations! Now you have PHP with 5.3.29 as php-5.3.29 * To configure your installed PHP further, you can edit the config file at /opt/phpbrew/php/php-5.3.29/etc/php.ini To use the newly built PHP, try the line(s) below: $ phpbrew use php-5.3.29 Or you can use switch command to switch your default php to php-5.3.29: $ phpbrew switch php-5.3.29 Enjoy!
Вывод phpinfo в браузере
Если возникли ещё какие-то проблемы, то надо проверить раздел troubleshooting.
FPM
Начиная с версии 1.22.0 phpbrew поддерживает команду fpm setup –systemctl для настройки fpm. В CentOS 7 у нас к сожалению systemd.
Если строго следовать всем правилам сборки PHP, то требуется указывать опцию –with-fpm-systemd
, но в процессе сборки появилось предупреждение
Notice: Following unknown configure options were used: --with-fpm-systemd Check './configure --help' for available options
что как оказалось в дальнейшем на работу не влияет.
Чтобы создать unit файл для нового fpm сервера выполним команду
# phpbrew fpm setup --systemctl *WARNING* php-fpm --pid option requires php >= 5.6, you need to update your php-fpm.conf for the pid file location. Writing systemctl service entry: /lib/systemd/system/phpbrew-fpm.service To reload systemctl service: systemctl daemon-reload Ensure that php-5.3.29 was built with --fpm-systemd option
Команды
systemctl start phpbrew-fpm.service systemctl restart phpbrew-fpm.service
выполняются очень долго. Почему так происходит нет времени разбираться. Сделаем, как советуют на github.
Изменим тип сервиса в файле /lib/systemd/system/phpbrew-fpm.service
.
Вместо Type=notify
укажем Type=simple
и дополнительно выполним
# systemctl daemon-reload
для перезапуска systemd, так как наш unit файл был изменен.
Теперь запуск/рестарт phpbrew-fpm.service
выполняется моментально.
Не работает mysql(i)
Также может не работать mysql(i) расширение. В моем случае adminer/pma показывали "No such file or directory".
К опциям сборки в phpbrew добавляем –with-mysql-sock=/var/lib/mysql/mysql.sock
В php.ini
указываем mysqli.default_socket = /var/lib/mysql/mysql.sock
gd
Просмотр информации о GD возможностях
/opt/phpbrew/php/php-5.3.29/bin/php -r 'var_dump(gd_info());'
Заканчивается ошибкой
PHP Fatal error: Call to undefined function gd_info() in Command line code on line 1
Попытка включить модуль также неудачна
phpbrew extension enable gd ===> Enabling extension gd gd extension is not installed. Suggestions: $ phpbrew ext install gd
Или даже так
PHP Warning: PHP Startup: Unable to load dynamic library '/opt/phpbrew/php/php-5.3.29/lib/php/extensions/no-debug-non-zts-20090626/gd.so' - /opt/phpbrew/php/php-5.3.29/lib/php/extensions/no-debug-non-zts-20090626/gd.so: undefined symbol: php_gd_gdImageJpegCtx in Unknown on line 0
Для корректной работы gd модуля недостаточно установить devel пакеты.
Чтобы не было таких ошибок или еще вот таких
Call to undefined function imagecreatefromjpeg() Call to undefined function imagecreatefrompng()
нужно добавить правильные опции сборки
--with-libdir=lib64 --with-gd=shared --enable-gd-natf --with-jpeg-dir=/usr --with-png-dir=/usr или --with-libdir=lib/x86_64-linux-gnu --with-gd=shared --enable-gd-natf --with-jpeg-dir=/usr --with-png-dir=/usr
Теперь можно посмотреть вывод phpinfo в браузере
или в консоли
# /opt/phpbrew/php/php-5.3.29/bin/php -r 'var_dump(gd_info());' array(12) { ["GD Version"]=> string(26) "bundled (2.1.0 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(false) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(true) ["JPEG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XPM Support"]=> bool(false) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) }
Ошибки при компилировании
configure: error: no acceptable cc found in $PATH
# yum install gcc
configure: error: xml2-config not found. Please check your libxml2 installation.
# yum install libxml2-devel
configure: error: Cannot find OpenSSL's <evp.h>
# yum install openssl-devel
Если будет configure: error: Cannot find OpenSSL's libraries
Дополнительно передаём phpbrew ключ –with-libdir=lib64
.
checking for BZip2 in default path… not found
configure: error: Please reinstall the BZip2 distribution
# yum install bzip2-devel
checking for icu-config… no
checking for location of ICU headers and libraries… not found
configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
# yum install libicu-devel
checking whether the C++ compiler (gcc -Wl,-rpath,/usr/lib64 -L/usr/lib64) works… no
configure: error: installation or configuration problem: C++ compiler cannot create executables.
# yum install gcc-c++
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
# yum install epel-release # yum install libmcrypt-devel
configure: error: Please reinstall readline - I cannot find readline.h
# yum install readline-devel
configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
# yum install libxslt-devel
configure: error: jpeglib.h not found.
# yum install libjpeg-devel
configure: error: png.h not found.
# yum install libpng-devel
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/
# yum install curl-devel
Обсуждение