RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:centos:phpbrew_php53

Установка 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

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/centos/phpbrew_php53.txt · Последнее изменение: 2017/10/02 16:07 — 127.0.0.1