После статьи о том, что 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 apt-get remove php5
sudo apt-get autoremove
Теперь можем развлекаться с установкой новой версии. Пока её нет в официальном репозитории, поэтому нужно подключить внешний репозиторий
sudo add-apt-repository ppa:ondrej/php
При выполнении этой команды может свалиться ошибка вида
Проблема в неактивированных локалях UTF-8.
Для того, чтобы её обойти нужно выполнить следующие команды
sudo export LANG=en_US.UTF-8
Теперь можем продолжать
sudo apt-get install -y php7.0
Проверим, всё ли в порядке
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 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. В нём есть проверка вида
которая в моей сборке идёт на строке 136. Поскольку скрипач mysql нам не нужен, то можем его смело удалять, получая в результате следующую строчку
После этого всё должно заработать.
А теперь самое интересное — производительность. Я проводил тестирование на главной странице своего блога и вот, что я получил в итоге:
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 комментариев
Оказалось был несовместимый плагин. Еще после его удаления не удавалось открыть админку. Эта проблема решилась установкой модуля DOM. Теперь все пашет!
Артур, отлично! Но лучше прикладывать логи к сообщению об ошибке. 500 ошибка имеет широкий спектр причин,поэтому по одному коду нельзя сказать, чем она была вызвана. Логи будут лежать в директории логов виртуального хоста, а также в /var/log директории в nginx и php-fpm соответственно.
Здравствуйте после попытки «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.
далек от серверов не знаю где искать
Спасибо за лог!
Ошибка здесь
Она говорит о том, что директива php_admin_value некорректна. А откуда она у Вас там?
Она была там до меня, при этом 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:.»
я их удалил стало ссылаться на 21 строку
AH00526: Syntax error on line 21 of /etc/apache2/vhosts/www-root/360-total-security.info
удалил и ее 🙂 вообще PHP не работает, соответственно и сайт, а с Apache все нормально 🙂 стартует
Так, что значит «PHP не работает»? На основании чего сделан такой вывод?
В этом коде у Вас 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:
Это не опечатки. Судя по всему, Вы поставили другой дистрибутив PHP 7.
Логи 500 ошибки можно посмотреть в Apache, но учтите, что данная конфигурация расчитана на NGINX + PHP-FPM.
Apache давно морально устарел.
Ну как бы то ни было заработало только с указанными командами, делал все по вашей инструкции, сайт в целом работает, проблема с ошибкой 500 в плагинах, голый WP работает без проблем
Спасибо за статью
Так а что за ошибка-то? Логи бы посмотреть по 500 ошибке.