После статьи о том, что 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: уже обновил =)