*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: уже обновил =)

Rating: 5.0/5. From 1 vote.
Please wait...

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

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

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

      No votes yet.
      Please wait...
  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.

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

    No votes yet.
    Please wait...
    1. Спасибо за лог!

      Ошибка здесь

      Invalid command ‘php_admin_value’, perhaps misspelled or defined by a module not included in the server configuration

      Она говорит о том, что директива php_admin_value некорректна. А откуда она у Вас там?

      Rating: 4.0/5. From 1 vote.
      Please wait...
      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:.»

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

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

      No votes yet.
      Please wait...
  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:

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

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

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

        Rating: 5.0/5. From 1 vote.
        Please wait...
        1. Так а что за ошибка-то? Логи бы посмотреть по 500 ошибке.

          No votes yet.
          Please wait...

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

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