PHP7: Экономим ресурсы, выигрываем в скорости

PHP7: Экономим ресурсы, выигрываем в скорости

PHP7: Экономим ресурсы, выигрываем в скорости

В мае 2015-го мы обновляли PHP на PHP 5.5. Время идет, разработка также не стоит на месте и пришло время PHP 7.

Главный вопрос — зачем? (Особенно он актуален, если у вас все работает и  устраивает.)

Прежде всего это параметры использования памяти, которой теперь требуется на порядка 50-ти процентов меньше и высокий отклик, как результат быстрая скорость выполнения запросов. Для кого-то это может быть не столь важным, т.к. на глаз изменения при загрузке страницы практически не заметны, а кто-то борется за каждую миллисекунду.

Подготовительный этап:

Не стоит сломя голову идти на продакшен и выполнять команды по данному мануалу, потренируйтесь на тестовой машине. Нет теста заведите. Нет возможности, ставьте Docker и пользуйтесь им.

Постарайтесь найти все то, что вы используете из «нестандартных» пакетов и функций. У меня установлены Gearman и Memcached, есть часть функций для работы со строками и изображениями, а также Geoip о существовании которого я случайно забыл во время миграции. Для того, чтобы не делать моих ошибок, и в дальнейшем не играть на продакшене в прокликивание всего и вся, следует обложить код хотя бы простым, но phpunit тестом:

Пример простейшего 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 раза.

Вы можете оставить комментарий ниже.