В мае 2015-го мы обновляли PHP на PHP 5.5. Время идет, разработка также не стоит на месте и пришло время PHP 7.
Главный вопрос — зачем? (Особенно он актуален, если у вас все работает и устраивает.)
Прежде всего это параметры использования памяти, которой теперь требуется на порядка 50-ти процентов меньше и высокий отклик, как результат быстрая скорость выполнения запросов. Для кого-то это может быть не столь важным, т.к. на глаз изменения при загрузке страницы практически не заметны, а кто-то борется за каждую миллисекунду.
Подготовительный этап:
Не стоит сломя голову идти на продакшен и выполнять команды по данному мануалу, потренируйтесь на тестовой машине. Нет теста заведите. Нет возможности, ставьте Docker и пользуйтесь им.
Постарайтесь найти все то, что вы используете из «нестандартных» пакетов и функций. У меня установлены Gearman и Memcached, есть часть функций для работы со строками и изображениями, а также Geoip о существовании которого я случайно забыл во время миграции. Для того, чтобы не делать моих ошибок, и в дальнейшем не играть на продакшене в прокликивание всего и вся, следует обложить код хотя бы простым, но phpunit тестом:
<?php class TVHTests extends PHPUnit_Framework_TestCase { private $calculator; protected function setUp() {} protected function tearDown() {} public function testClassMemcached() { $this->assertTrue(class_exists("Memcached"),'Memcached не установлен'); } public function testClassGerman() { $this->assertTrue(class_exists("GearmanClient"),"GearmanClient не установлен"); } public function testFunctionImagecreatefromjpeg() { $this->assertTrue(function_exists("imagecreatefromjpeg"),"Функция imagecreatefromjpeg не найдена. Необходим пакет php-gd."); } public function testFunctionStrtoupper() { $this->assertTrue(function_exists("mb_strtoupper"),"Функция mb_strtoupper не найдена. Необходим пакет php-mbstring."); } public function testFunctionGeoip() { $this->assertTrue(function_exists("geoip_record_by_name"),"Функция geoip_record_by_name не найдена."); } } |
В моем случае обнаружилось, что нужно перенести проект с «php-memcache» на «php-memcached»
Проверьте свой код на совместимость с PHP7:
1. https://github.com/Alexia/php7mar
2. https://github.com/sstalle/php7cc
Непосредственно установка php7.
1. Я сохраню список установленных пакетов:
yum list installed | grep php > /tmp/php55_installed
2. Удаляем старые дистрибутивы и обновляем систему:
yum remove php55w* yum update -y
3. Я буду ставить php7 из стороннего репозитария:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
4. Установка:
yum install php70w-fpm php70w-opcache php70w php70w-intl php70w-mysqli php70w-mbstring php70w-gd php70w-devel yum install php70w-imap php70w-mbstring php70w-mcrypt php70w-snmp php70w-xml php70w-pecl-memcached
5. Доустановка Gearman и Memcached
yum install git yum install gcc make autoconf libc-dev pkg-config cd /usr/local/src/ git clone https://github.com/wcgallego/pecl-gearman.git cd pecl-gearman phpize ./configure make make test make install touch /etc/php.d/gearman.ini echo 'extension=gearman.so' >> /etc/php.d/gearman.ini cd /usr/local/src/ git clone https://github.com/php-memcached-dev/php-memcached cd php-memcached ./configure make make test make install touch /etc/php.d/memcached.ini echo 'extension=memcached.so' >> /etc/php.d/memcached.ini
5. У меня сервисы работают через «php-fpm», стартую сервис:
chkconfig php-fpm on service php-fpm start
Запускаем проект и начинаем править код!
6. Основные моменты из-за которых старый код не будет работать:
1. Если в коде используется глобальный класс с именем String, код перестанет работать.
2. Выражение $foo->$bar[‘baz’]() раньше означало $foo->{$bar[‘baz’]}(), сейчас интерпретируется слева-направо: ($foo->$bar)[‘baz’]()
3. Старые расширения:
— mysql (замена на pdo/mysqli),
— ereg (замена на preg)
Как видно процедура не сложная, и при наличии навыков на средней мощности VPS делается примерно за 15 минут.
На своих проектах в среднем я получил увеличении производительности примерно в 2,5 раза.