Стоит ли переходить на PHP7? Кому не стоит обновляться

Несколько дней назад я переключил свой сервер с порядка 30-ти сайтами на PHP 7. Некоторые из них были достаточно старыми и составляли широкий набор с различных фреймворков и CMS. Вот несколько советов для тех кто еще не решил переходить на PHP 7 или нет.

Начнем с того что я понимаю что есть много людей которые не считают стабильную версию действительно «стабильной» пока она чуть-чуть не повзрослела, ожидая что еще найдутся какие-то баги или несовместимости. С того что я пока видел, пробуя каждый release candidate как только он выходил, совсем безопасно переключиться на PHP 7 как только он выйдет. Я ни разу не заметил какого-то непонятного поведения или вылета которому виной не был бы я сам. Несмотря на то что это новая версия она не несет много несовместимых изменений, то есть по большому счету можете относиться к ней как к просто PHP 5.7 только существенно быстрее.

И скорость действительно впечатляет, даже невероятно как. Для примера простой сайт на PHPixie заработал почти в три раза быстрее практически сравнившись со скоростью Phalcon на PHP 5.6, несколько сайтов на Wordpress показали стабильный прирост в скорости в два раза. Если учесть недавний отчет от Google что потеря даже 10% производительности загрузки страниц приводит к ощутимой потери клиентов, то если вы можете запросто ускорить работу сайта в два раза просто обновив PHP вы получаете больше продаж ничего не потратив. Вспомните об этом, когда будете убеждать своего менеджера перейти на PHP 7. Ничего не убеждает лучше, чем объем продаж.

Несколько замечаний

Расширение mysql больше недоступно, так что если вы еще не перешли на PDO или mysqli то теперь уж точно придется. Благо во многих случаях достаточно просто заменить вызовы к mysql_ функциям на mysqli_ .

E_STRICT ошибки реклассифицированы как другие типы ошибок. Если раньше вы их прятали или игнорировали, то теперь они начнут всплывать вместе с другими. Например, вызов нестатических методов статически теперь выбрасывает E_DEPRECATED что создало кучу проблем с Joomla 2.5 который почему-то делает это довольно часто. Также несовместимое наследование теперь классифицируется как E_WARNING . Wordpress уже с февраля тестируется на работу с PHP 7, так что с ним самим проблем никаких нет, правда, несколько плагинов таки оказались несовместимыми.

foreach теперь всегда работает с копией массива, так что все изменения массива во время итерации не повлияют на саму итерацию. На самом деле, во многих случаях оно и так работало и сам случай довольно редкий, но все же в одном из плагинов я на это наткнулся.

Теперь $foo->$bar["baz"] интерпретируется как ($foo->$bar)["baz"] а не $foo->{$bar["baz"]} как в PHP 5. Это редкий случай, но тоже попалось в одном из плагинов, и как оказалось в Magento 1.x (core/Mage/Core/Model/Layout.php ).

Имейте в виду, что не все расширения уже поддерживают PHP 7. Я уже не могу использовать понравившийся мне XCache, который верно служил мне много лет.

В сумме мне заняло около 5 часов чтобы перевести все сайты на PHP 7. Процесс совсем нетрудный и пакеты доступны уже для всех популярных дистрибутивов. Так что даже если вы собираетесь ждать стабильного релиза (уже совсем недолго), нет никакой причины не приготовить свои сайты к миграции наперед.

Стоит ли переходить на новую версию PHP 7.0 ? - Однозначно стоит, даже не думайте — переходите!

В седьмой версии достаточно много нововведений. Основные из них:

  1. в основе ядра PHP 7 используется PHPNG. Новое ядро дает прирост производительности сайтам от 40%;
  2. type Hints и возвращаемые значения. Теперь при объявлении функции для каждой переменной можно указывать свой тип, а также тип данных, который вернет функция. Доступные типы: int, float, string и bool;
  3. комбинированный оператор сравнения и многое другое.

В PHP 7 были удалены расширения:

  • mysql

Удаленные расширения давно были в статусе "deprecated", их использование приводило к выводу на экран warning. Вместо "mysql" нужно использовать "mysqli" или "pdo_mysql", а вместо "ereg" => "preg_*".

Более детально ознакомиться с новинками PHP 7 можно на официальной странице .

Стоит ли переходить на PHP 7?

На данный момент самое простое, что вы можете сделать для увеличения производительности сайта, это перейти на PHP 7.0.x. Прирост скорости также зависит от того, как написан ваш проект. Если вы еще сомневаетесь, покажем некоторые сравнения:

Бенчмарки PHP 5.6 vs PHP 7 для нектоторых фреймфорков и CMS (Zend framework, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM и др):

По всем фреймворкам прирост производительности значительный. Давайте посмотрим, как обстоит дело с функциями и конструкциями ядра:

Если графики вас убедили, можно попробовать перенести свой сайт на новую версию PHP и ощутить прирост на реальном проекте.

При создании ноды, выберите в списке серверов "Blue", для того чтобы нода была создана на сервере с PHP 7.

Вот так показывает себя 1c bitrix на базе SSD диска и PHP 7.0

Итак, у вас есть старенький, но уж очень милый сердцу сайт, который вы решаетесь из жалости (или, возможно, перечитав Хабра) перевести на PHP7. С волнением ожидая резкого роста производительности, вы смахиваете пыль с бедного сайта и решительно переключаете в панели управления хостингом версию PHP.

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

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

Резервные копии

Делаем резервные копии сайта (а заодно и баз данных). Ведь кто не делает резервные копи - сам себе враг, верно? Для разного рода экспериментов имеет смысл добавить еще один сайт на хостинге и скопировать в него файлы, которые мы сейчас будем править.

Журналы ошибок

Настроим ведение журнала ошибок PHP в файл.htaccess (если он не был настроен ранее):

php_value display_errors 0
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

Работа с MySQL

Допустим, сайт использует базы данных, и вы видите ошибки вроде такой:

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Это оттого, что в современных версиях PHP (начиная с PHP 5.5.0) оригинальное расширение MySQL не поддерживается. Разработчики рекомендуют использовать MySQLi или PDO. Попробуем перейти на MySQLi, это просто:

Предположим, что сайт написан с использованием процедурного подхода, который представляет собой классический говнокод многие и сейчас считают лаконичным и эффективным решением. В таком случае, следующую устаревшую конструкцию для подключения к базе данных:

$link = mysql_connect(‘localhost’, $user, $password)
mysql_select_db($dbname, $link)
mysql_query(‘set names cp1251’)

можно заменить на:

$link = mysqli_connect(‘localhost’, $user, $password, $dbname)
mysqli_query($link, ‘set names cp1251’)

для запросов:

$result=mysql_query($query,$cid)

заменить на:

$result=mysqli_query($cid, $query)

Другие популярные функции легко меняются на их аналоги с буквой ‘i’:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

В результате этих несложных действий данные из БД должны успешно собираться и отправляться.

Кодировка

Настоящий олдскул - это сайт в CP1251 (как минимум). Всё превратилось в ромбики или прочие козяблики?

Скорее всего, достаточно будет указать кодировку в.htaccess таким образом:

php_value default_charset «cp1251»

Регулярные выражения

Также вы можете наблюдать ошибки следующего рода:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Это означает, что модификатор /e, который позволял передать произвольной функции результат регулярного выражения, теперь не поддерживается. В таких случаях рекомендуется использовать функцию preg_replace_callback

Допустим, у нас есть такое регулярное выражение:

$string=preg_replace(«/:({1,10}):/e», «print_smile(‘\\1’)», $string)

с заменой на preg_replace_callback оно должно выглядеть вот так:

$string=preg_replace_callback(«/:({1,10}):/», create_function(‘$matches’, ‘return print_smile($matches)’), $string)

здесь все просто, регулярное выражение теперь указывается в качестве первого аргумента (без модификатора /e, разумеется), а в качестве второго аргумента указывается анонимная функция (которая будет выполнена после применения регулярного выражения) с двумя аргументами: массив $matches, где будут сохранены данные, совпадающие с регулярным выражением и вызов внешней функции с аргументами. В данном примере внешняя функция называется print_smile и ей передается аргументом первое найденное вхождение. То, что в preg_replace было \\1 (первое найденное вхождение) станет $matches (если аргументов было больше, то будет $matches, $matches и так далее).

Вот еще один пример, посложнее:

Было так:

$out=preg_replace(«/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/es», «feed_out_sub_rm(‘\\2′,’$base_prefix’,’$nick’,’$id_entry’)», $out)

Стало вот так:

$out=preg_replace_callback(‘/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/s’, create_function(‘$matches’, ‘return feed_out_sub_rm($matches, «‘.$base_prefix."», «‘.$nick."», «‘.$id_entry."») ‘), $out)

здесь легко запутаться в кавычках, будьте внимательны.

Копаясь в регулярных выражениях, можно вспомнить еще про две функции, которые с версии PHP 5.3.0 считаются устаревшими (и не поддерживаются). Симптомы следующие:

Fatal error: Uncaught Error: Call to undefined function ereg_replace()

Если регулярное выражение в ereg_replace простое, то можно обойтись просто установкой граничных символов, как здесь:

$str=ereg_replace(«[\r\t\n]»,»»,$str)
$str=preg_replace(«/[\r\t\n]/»,»»,$str)

Аналогичный симптом:

Fatal error: Uncaught Error: Call to undefined function split()

$var_pair=split(«=»,$tmp)

$var_pair=explode(«=»,$tmp)

Если регулярное выражение посложнее, то пробуем преобразовать к preg_split.

Если что-то не получается, или ваш случай совсем не похож на наши примеры - пишите комментарии, попробуем разобраться вместе.

Для того, чтобы оставлять комментарии к посту, авторизуйтесь, используя свой аккаунт в социальных сетях ВКонтакте/FaceBook, или аккаунт в Google/Яндекс.

Добрый день уважаемые читатели и подписчики, наверняка многие из вас слышали информацию, о том, что поисковая система Google прилагает огромные усилия, для перевода всех сайтов в интернете на безопасное соединение https, за счет установки сертификатов шифрования для веб сайтов , предлагая вебмастерам получить бонусы в поисковой выдаче, при прочих равных. Вот и я всерьез задумался над этой задачей, планируя осуществить переезд сайта в летнее время, но перед этим делом я должен все подготовить и одной из ступеней подготовки я для себя поставил, переход с php 5 на php 7, на своем хостинге mchost.ru

Для чего мне переход с php 5 на php 7

На это меня натолкнуло две вещи:

  • Я получаю больше функциональных возможностей от php 7
  • Я уменьшаю нагрузку на свои ресурсы и уменьшая количество запросов, тем самым увеличивая скорость загрузки сайта, очень сейчас актуально для мобильной поисковой выдачи, процент которой уже перевалил за 50 процентов.

Я вам уже описывал в статье, как мой сайт загибался от нагрузки парсинга не него, и техническая поддержка, после решения проблем, так же порекомендовала, при поддержке сайтом php 7, перейти именно на нее. Тесты сравнения производительности php 5 и php 7 , смотрите по ссылке.

Смена версии php

Так как у меня VPS хостинг на mchost, то это делается очень просто. Заходим в личный кабинет, по адресу https://cp.mchost.ru/login.php. Далее как любой нормальный человек, вы должны сделать резервную копию сайта. Заходим в пункт резервные копии, выбираем сайт и создаем.

Следующим шагом, вы выбираете пункт сайты. Находите среди них нужный и нажимаете Настройки php.

В пункте php для домена, у вас отобразится список возможных версий, на текущий момент самой последней является FastCGI PHP 7.1

Начнется процесс перехода с php 5 на php 7, в справа у вас будет прогресс бар.

как видите, до изменения версии, у меня это 5.4.45

Смотрим теперь 7.1

Хочу отметить, что сам перевод между версиями, может занять до 15 минут, так, что лучше это действие отложить на вечернее время

Если кстати хотите получить 3 месяца халявы от данного хостинга, то щелкайте по баннеру ниже и вводите промокод 48C4-D018-AC60-50C6

После того как вы перевели сайт на свежую версию, проверьте весь функционал вашего ресурса, все ли работает и отображается корректно, если нет у вас два выхода, 1 это откатиться, второй это доработать сайт.

Возможные проблемы

Бывают случаи, что вы получаете ошибку: Ошибка установки соединения с базой данных

Решается она просто, вам нужно обновить пароль на базу данных, в личном кабинете. Выбираем пункт Базы данных и щелкаем по нужной (редактировать)

Задаем заново пароль.

Если например вы не помните пароль от нее и у вас движок сайта, как и у меня WordPress, то можно подключить к ftp серверу и найти в корне сайта файл wp-config.php

Откройте его и найдите поле (Пароль к базе данных MySQL)

Если у вас возникают,еще какие то проблемы, то пишите о них в комментариях и мы попробуем решить их вместе. Так, что не поленитесь проделать данную задачу, важно использовать все возможности свежего программного обеспечения, тем более, вы еще бонусом получаете меньшую нагрузку на хостинг и большую скорость работы вашего ресурса.

1 января 2016

Выпуск PHP 7.0.0 состоялся ещё в декабре 2015 года, но вопрос перехода на эту версию до сих пор волнует умы прогрессивной молодёжи. И не мудрено, ведь каждый значительный выпуск PHP несёт в себе множество полезных нововведений.

Зачем обновляться?

Производительность

В сети можно встретить множество синтетических и реальных тестов производительности разных версий PHP и HHVM, которые говорят только об одном - с каждой версией PHP веб становится быстрее и быстрее. Большинство же моих проектов работают на MODX Revolution и CodeIgniter 3. И, естественно, мне было любопытно узнать, что изменится после смены версии PHP.

MODX Evolution

Конечно, я бы мог проверить изменение производительности и для MODX Evolution, но в этой системе очень много кода, зависящего от, как я написал выше, удалённых расширений PHP. Однако, в версии , подготовленной пользователем , появилась полная поддержка PHP 7.

MODX Revolution

Итак, я взял несколько сайтов, работающих на PHP 5.6. Измеряю я обычно количество запросов и время на генерацию страницы. Логично предположить, что количество запросов мало коррелирует с версией PHP, но лишним добавить и эту информацию не будет. Начиная с версии реализована полная совместимость с PHP 7. До этого была лишь частичная поддержка PHP 7, ввиду чего у меня не работала админка, хотя сам сайт отлично работал.

Сайт №1

Версия PHP Кэширование Запросов Время, с
5.6 156 1.18
5.6 17 0.25
7 161 0.43
7 17 0.02

Сайт №2

Сайт №3

Как видно, переключение версии PHP на последнюю положительно сказалось на производительности сайтов, увеличив её в 1.5-3 раза, а кое-где (например, на главной странице моего сайта) даже в 10 раз.

CodeIgniter 3

Я не могу похвастаться большим количеством проектов на CodeIgniter, но даже они обязывают внимательно относиться к производительности, так как количество статей и уникальных посетителей в месяц на одном из них исчисляется тысячами. На данный момент я занимаюсь оптимизацией и рефакторингом одного из них, где и без перехода на PHP 7 производительность кое-где возросла в несколько раз. В ближайшее время, когда я закончу текущую работу, я обязательно напишу о результатах смены версии.

Синтаксис

Синтаксис претерпел некоторые изменения, которые повлияют на обратную совместимость. Помимо официальной документации советую изучить примеры кода на GitHub, например, эти: .

Кому не стоит обновляться

Не стоит обновляться тем, чьи проекты основаны на расширениях, удалённых в новом PHP. Также стоит поискать в интернете информацию о незначительных изменениях синтаксиса, так как есть моменты, нарушающие обратную совместимость. Конечно, таких случаев один на тысячу, если не реже, но лучше перестраховаться.

Хостинг-провайдеры

Выпуск PHP 7 состоялся относительно недавно, поэтому не все хостинг-провайдеры дают возможность опробовать новинку. Например, beget уже позволяет порадоваться скоростью, а в timeweb, наверное, считают PHP 7 недостаточно стабильным.

Чужой опыт

Вывод

За переход на последнюю версию PHP больше «За», чем «Против». Поэтому, если вам охота лёгкой оптимизации, обновляйте PHP.

Loading...Loading...