3

Обновление до php 5.4 в Битрикс

Имеется сайт, окружение для которого подготавливалось с помощью «Веб-окружение Битрикс» 4ой версии на CentOs6. В нем используется PHP5.3, который надо обновить.

Мне техподдержка битрикс порекомендовала подготовить новое окружение, развернуть bitrix-env 5ой версии, которое ставит php54 и перенести туда сайт. Меня данный подход не устраивает по многим причинам:

  • База и приложение весят довольно много, поэтому, придется строить схему с репликацией базы и контента. Ради простого обновления PHP…
  • конфиги nginx и apache немного исправлены (А Битрикс любит их перетирать в default при любой возможности)
  • заново разворачивать окружение, что бы обновить PHP — это не нормально!

Обновление PHP без обновления до bitrix-env 5

ВНИМАНИЕ!!!

На данный момент все описанное ниже я делал на тестовом сервере. Проверена только основная работоспособность!

Внимательно смотрю что же делает bitrix-env.sh. Интересует все что касается PHP. Итак:

# Похоже, флаг установки php54
PHP54=1
...
# далее в переменной version_c будет хранится желаемая версия
echo -e "\e[1;31mWhich version you want to install? (4|5)\e[0m"
read version_c
...
# Далее самое интересное
# если выбрана 4, то о PHP54 речи не идет
[[ $version_c == 4 ]] && yum -y install bitrix-env4
if [[ $version_c == 5 ]]; then
yum clean all
# если выборана версия 5, то подключаем remi repo
if [[ $PHP54 -gt 0 ]]; then
    # enable remi repository
    rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    # включается [remi]
    sed -i "0,/php55/s/enabled=0/enabled=1/" /etc/yum.repos.d/remi.repo;
    ...
    # install php 5.4
    yum -y install php php-mysql php-pecl-apcu php-pecl-zendopcache
    ...
else
    ...
fi

# create opcache package
if [[ $PHP54 -gt 0 ]]; then
  if [[ $is_x86_64 -eq 1 ]]; then
    echo 'zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable=1
opcache.memory_consumption=124M
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist' > /etc/php.d/opcache.ini
  else
    echo 'zend_extension=/usr/lib/php/modules/opcache.so
opcache.enable=1
opcache.memory_consumption=124M
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist' > /etc/php.d/opcache.ini
  fi
fi
...

Т.е. не вдаваясь в подробности что включает в себя пакеты bitrix-env4 и bitrix-env, видно, что PHP54 тянется из remi репозитария.
Обращаю внимание на команду sed -i "0,/php55/s/enabled=0/enabled=1/" /etc/yum.repos.d/remi.repo. Это значит, что нужно заменить ‘enabled=0’ на ‘enabled=1’ с 0ой строки до строки, включающей ‘php55’. Т.е. просто включить [remi], не включая остальные репозитории ([remi-php55], [remi-php56], …).

Дальше идет настройка opcache.

OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

Таким образом мне нужно:
1. Подключить и включить remi repo
2. Обновить / Установить следующие пакеты:
— php
— php-mysql
— php-pecl-apcu
— php-pecl-zendopcache
3. Включить opcache

# yum update
# curl -O http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && rpm -Uvh remi-release-6.rpm
# sed -i "0,/php55/s/enabled=0/enabled=1/" /etc/yum.repos.d/remi.repo
# yum update php*
# rpm --nodeps -e php-pecl-apc && yum install php-pecl-apcu php-pecl-zendopcache

Обращаю внимание, что после этого yum check будет выдавать

bitrix-env4-3.4-bitrix.noarch имеет недостающие зависимости от php-pecl-apc < ('0', '4.0', None)

В /etc/php.d/bitrixenv.ini:

; allow_call_time_pass_reference = On

/etc/php.d/opcache.ini привел к виду, предлагаемому Битрикс в bitrix-env.sh

После этого:

[root@bitrix ~]# php -v
PHP 5.4.40 (cli) (built: Apr 15 2015 15:55:28) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.5, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans

# service httpd restart

Обновление PHP до 5.4 и bitrix-env до 5 версии

[root@bitrix ~]# ./menu.sh

20. Update system to BitrixEnv 5.0

Это действо притащит еще 42 пакета, включая paramiko, ansible =)

Found network interfaces on the server:
------------------------------------------------------------------------------------
       Int |       Link |      Speed |                  MAC | IPAddress
------------------------------------------------------------------------------------
      eth0 |        yes |            |    52:54:00:a9:7e:74 | 192.168.122.179
------------------------------------------------------------------------------------
If you want to add the server to an existing cluster
Use one of the addresses listed above on master server
Available actions:
      1. Create Management pool of server
      2. Manage localhost
      0. Exit

Enter selection:

Создаю новый пул (Create Management pool of server), затем ввожу FQDN имя машины.

Created manager configuration for identifier=bitrix.test.local interface=eth0 netaddress=192.168.122.179
Created sshkey - /etc/ansible/.ssh/3tsrm1M5Qc.bxkey
Update config file /etc/ansible/ansible.cfg
Created pool configuration in /etc/ansible/hosts
All operations complete

CREATE_POOL complete: Press ENTER for exit: 

Затем Manage Hosts in the pool(1) — Upgrade php and mysql versions (7)

Как я понимаю такой порядок обновления предполагает Битрикс.

В итоге я получил:

[root@bitrix ~]# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_dblib.so' - /usr/lib64/php/modules/pdo_dblib.so: undefined symbol:     php_pdo_register_driver in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/xmlreader.so' - /usr/lib64/php/modules/xmlreader.so: undefined symbol: dom_node_class_entry in Unknown on line 0
PHP 5.4.40 (cli) (built: Apr 15 2015 15:55:28) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.5, Copyright (c) 1999-2015, by Zend Technologies

Удачных обновлений!

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.