*nixPHPPHP7

WordPress, PHP7 и немного бенчмарков

После статьи о том, что Badoo перешли на PHP7, я понял, что пора и мне обновить PHP 5.5 на своей площадке.
Об алгоритме действий и подводных камнях — под катом

Совершенно не секретен тот факт, что мой блог крутится на движке WordPress 4.4. Так что этот факт ещё придётся учесть ниже.
А пока распишу ТТХ того, что есть к обновлению:

  • ОС Ubuntu 14.04.3 LTS
  • PHP 5.5.31 на борту
  • Apache, NGINX и куча модулей PHP

Отмечу, что PHP 7 ставится только на Debian trusty и выше. Так что обновиться хотя бы до 14.04 придётся.

Ломать — не строить. И начинать нужно с того, чтобы снести PHP 5.5.

sudo a2dismod php5
sudo apt-get remove php5
sudo apt-get autoremove

Теперь можем развлекаться с установкой новой версии. Пока её нет в официальном репозитории, поэтому нужно подключить внешний репозиторий


sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:ondrej/php

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

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 92: ordinal not in range(128)

Проблема в неактивированных локалях UTF-8.
Для того, чтобы её обойти нужно выполнить следующие команды

sudo locale-gen en_US.UTF-8
sudo export LANG=en_US.UTF-8

Теперь можем продолжать

sudo apt-get update
sudo apt-get install -y php7.0

Проверим, всё ли в порядке

php -v

PHP 7.0.4-6+deb.sury.org~trusty+5 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

PHP установился. Теперь надо научить Apache (в моём случае скрипты обслуживает Apache, для PHP-FPM всё намного проще) общаться с PHP. Да и модули нам тоже не помешают!


sudo apt-get install libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json
sudo service apache2 restart
sudo a2enmod php7
sudo apache2 restart

Теперь можно попробовать запустить WordPress. Но он скажет, что-то типа «‘Your PHP installation appears to be missing the MySQL extension which is required by WordPress.» или «Похоже, в вашей конфигурации PHP отсутствует расширение MySQL, необходимое для работы WordPress.». Дело тут в том, что движок WP при загрузке проверяет наличие установленного модуля php-mysql, который относится к deprecated модулям, начиная с версии PHP 5.5. А начиная с PHP 7 его даже нельзя поставить. Есть готовые модули для WordPress, которые фиксят это. Но зачем брать готовый модуль с неявным функционалом, когда можно пофиксить всё самостоятельно?

Ищем файл wp-includes/load.php. В нём есть проверка вида

if ( ! extension_loaded( 'mysql' ) && ! extension_loaded( 'mysqli' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' ) ) {

которая в моей сборке идёт на строке 136. Поскольку скрипач mysql нам не нужен, то можем его смело удалять, получая в результате следующую строчку


if ( ! extension_loaded( 'mysqli' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' ) ) {

После этого всё должно заработать.

А теперь самое интересное — производительность. Я проводил тестирование на главной странице своего блога и вот, что я получил в итоге:

PHP 5.5 PHP 7
Потребление RAM 4.3 MB 3.4 MB
Загрузка страницы с кэшем 381 ms 140 ms

Как видите, разница в потреблении RAM — почти 1 мегабайт! Т.е. получаем снижение нагрузки на RAM в 25% простым обновление движка PHP.
По скорости загрузки страницы тесты проведу чуть позже, т.к. всю процедуру я проделывал на тестовой виртуалке.

UPD: скорость загрузки главной увеличена в 2.7 раза! Впечатляет?
Если хотите получить результаты других бенчмарков — жду в комментариях.

Но решение однозначно принято — скоро мой блог обновит техническую начинку!
UPD 2: уже обновил =)

WordPress, PHP7 и немного бенчмарков: 11 комментариев

  1. Оказалось был несовместимый плагин. Еще после его удаления не удавалось открыть админку. Эта проблема решилась установкой модуля DOM. Теперь все пашет!

    1. Артур, отлично! Но лучше прикладывать логи к сообщению об ошибке. 500 ошибка имеет широкий спектр причин,поэтому по одному коду нельзя сказать, чем она была вызвана. Логи будут лежать в директории логов виртуального хоста, а также в /var/log директории в nginx и php-fpm соответственно.

  2. Здравствуйте после попытки «service apache2 restart» ошибка
    Job for apache2.service failed. See ‘systemctl status apache2.service’ and ‘journalctl -xn’ for details.

    ввожу

    /etc/init.d/apache2 status
    ● apache2.service — LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2)
    Drop-In: /lib/systemd/system/apache2.service.d
    └─forking.conf
    Active: failed (Result: exit-code) since Вс 2017-07-30 12:35:55 MSK; 10min ago
    Process: 3717 ExecStart=/etc/init.d/apache2 start (code=exited, status=1/FAILURE)

    июл 30 12:35:55 rainbowsky.ru apache2[3717]: Starting web server: apache2 failed!
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: The apache2 configtest failed. … (warning).
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: Output of config test was:
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: AH00526: Syntax error on line 18 of /etc/apache2/vhosts/www-root/360-total-security.info:
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: Invalid command ‘php_admin_value’, perhaps misspelled or defined by a module not included in the server configuration
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: Action ‘configtest’ failed.
    июл 30 12:35:55 rainbowsky.ru apache2[3717]: The Apache error log may have more information.
    июл 30 12:35:55 rainbowsky.ru systemd[1]: apache2.service: control process exited, code=exited status=1
    июл 30 12:35:55 rainbowsky.ru systemd[1]: Failed to start LSB: Apache2 web server.
    июл 30 12:35:55 rainbowsky.ru systemd[1]: Unit apache2.service entered failed state.

    далек от серверов не знаю где искать

    1. Спасибо за лог!

      Ошибка здесь
      Invalid command ‘php_admin_value’, perhaps misspelled or defined by a module not included in the server configuration
      Она говорит о том, что директива php_admin_value некорректна. А откуда она у Вас там?

      1. Она была там до меня, при этом PHP Version 5.6.30-0+deb8u1 работает при ее наличии нормально,
        вот эти значения:
        php_admin_value sendmail_path «/usr/sbin/sendmail -t -i -f webmaster@360-total-security.info»
        php_admin_value upload_tmp_dir «/var/www/www-root/data/mod-tmp»
        php_admin_value session.save_path «/var/www/www-root/data/mod-tmp»
        php_admin_value open_basedir «/var/www/www-root/data:.»

  3. я их удалил стало ссылаться на 21 строку
    AH00526: Syntax error on line 21 of /etc/apache2/vhosts/www-root/360-total-security.info
    удалил и ее 🙂 вообще PHP не работает, соответственно и сайт, а с Apache все нормально 🙂 стартует

    1. Так, что значит «PHP не работает»? На основании чего сделан такой вывод?

  4. В этом коде у Вас 2 опечатки в 2-х последних строчках, из-за чего не стартует php7.0
    sudo apt-get install libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json
    sudo service apache2 restart
    sudo a2enmod php7
    sudo apache2 restart
    должно быть:
    sudo a2enmod php7.0
    sudo service apache2 restart
    тогда и php и Apache стартуют и ни на что не ругаются, но сам WP отдает HTTP ERROR 500:

    1. Это не опечатки. Судя по всему, Вы поставили другой дистрибутив PHP 7.

      Логи 500 ошибки можно посмотреть в Apache, но учтите, что данная конфигурация расчитана на NGINX + PHP-FPM.
      Apache давно морально устарел.

      1. Ну как бы то ни было заработало только с указанными командами, делал все по вашей инструкции, сайт в целом работает, проблема с ошибкой 500 в плагинах, голый WP работает без проблем
        Спасибо за статью

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *