Бордови дневник. Струва ли си да преминете към PHP7? Преход към php 7

Добър ден, скъпи читатели и абонати, много от вас вероятно са чували информацията, че търсачката 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 Database Password)

Ако имате други проблеми, пишете за тях в коментарите и ние ще се опитаме да ги разрешим заедно. Така че, не бъдете твърде мързеливи, за да изпълните тази задача, важно е да използвате всички възможности на най-новия софтуер, особено след като получавате и бонус от по-малко натоварване на хостинга и по-голяма скорост на вашия ресурс.

Струва ли си да надстроите до новата версия на PHP 7.0? - Определено си заслужава, дори не си го и помисляйте - давайте!

Седмата версия има доста нововъведения. Основните от тях:

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

Разширенията са премахнати в PHP 7:

  • mysql

Премахнатите разширения отдавна са били в състояние „отхвърлени“; използването им е довело до показване на предупреждение на екрана. Вместо "mysql" трябва да използвате "mysqli" или "pdo_mysql", а вместо "ereg" => "preg_*".

Можете да научите повече за новите PHP 7 продукти на официалната страница.

Струва ли си да надстроите до PHP 7?

На този моментНай-простото нещо, което можете да направите, за да подобрите ефективността на сайта, е да надстроите до PHP 7.0.x. Увеличаването на скоростта също зависи от това как е написан вашият проект. Ако все още се съмнявате, нека покажем някои сравнения:

Бенчмаркове PHP 5.6 срещу PHP 7за някои рамки и CMS (Zend framework, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM и др.):

За всички рамки увеличението на производителността е значително. Нека видим как стоят нещата с функциите и конструкциите на ядрото:

Ако графиките ви убедят, можете да опитате да мигрирате сайта си към нова версия на PHP и да почувствате печалбите в реален проект.

Когато създавате възел, изберете „Blue“ в списъка със сървъри, така че възелът да бъде създаден на сървър с PHP 7.

Ето как се показва 1c bitrix на базата на SSD устройство и PHP 7.0

1 януари 2016 г

PHP 7.0.0 беше пуснат през декември 2015 г., но въпросът за преминаването към тази версия все още тревожи умовете на прогресивната младеж. И не е чудно, защото всяка значима версия на PHP носи със себе си много полезни нововъведения.

Защо да се актуализира?

производителност

Можете да намерите много синтетични и реални тестовепроизводителност на различни версии на PHP и HHVM, които говорят само за едно – с всяка версия на PHP мрежата става все по-бърза. Повечето от моите проекти работят върху MODX Revolution и CodeIgniter 3. И, естествено, бях любопитен да разбера какво ще се промени след смяната на PHP версията.

MODX Evolution

Разбира се, бих могъл да проверя промените в производителността за MODX Evolution, но в тази система има много код, който зависи от, както писах по-горе, отдалечени PHP разширения. Въпреки това, произведената от потребителите версия вече има пълна поддръжка за PHP 7.

MODX революция

И така, взех няколко сайта, работещи на PHP 5.6. Обикновено измервам броя на заявките и времето, необходимо за генериране на страница. Логично е да се предположи, че броят на заявките има малка връзка с версията на PHP, но не би било излишно да добавите тази информация. Започвайки с версията, беше реализирана пълна съвместимост с PHP 7. Преди това имаше само частична поддръжка за PHP 7, поради което административният панел не работеше за мен, въпреки че самият сайт работеше добре.

Обект №1

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

Обект No2

Обект No3

Както можете да видите, превключването на PHP версията към най-новата имаше положителен ефект върху производителността на сайта, като го увеличи с 1,5-3 пъти, а на някои места (например на главната страница на моя сайт) дори 10 пъти.

CodeIgniter 3

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

Синтаксис

Синтаксисът е претърпял някои промени, които ще повлияят на обратната съвместимост. В допълнение към официалната документация, съветвам ви да изучавате примери за кодове в GitHub, например тези: .

Кой не трябва да актуализира?

Тези, чиито проекти са базирани на разширения, премахнати в новия PHP, не трябва да актуализират. Също така си струва да потърсите в Интернет информация за незначителни промени в синтаксиса, тъй като има точки, които нарушават обратната съвместимост. Разбира се, такива случаи са един на хиляда, ако не и по-рядко, но е по-добре да сте в безопасност.

Хостинг доставчици

Пускането на PHP 7 се състоя сравнително наскоро, така че не всички хостинг доставчици предлагат възможност да изпробват новия продукт. Например beget вече ви позволява да се насладите на скоростта, но timeweb вероятно смята PHP 7 за недостатъчно стабилен.

Чужд опит

Заключение

За преминаване към последна версия PHP има повече плюсове, отколкото минуси. Ето защо, ако искате лесна оптимизация, актуализирайте PHP.

Преди няколко дни превключих сървъра си с около 30 сайта на PHP 7. Някои от тях бяха доста стари и съставляваха широк набор от различни рамки и CMS. Ето няколко съвета за тези, които все още не са решили дали да преминат към PHP 7 или не.

Нека започнем с факта, че разбирам, че има много хора, които не смятат стабилната версия за наистина „стабилна“, докато не узрее малко, очаквайки, че все още ще има някои грешки или несъвместимости. От това, което видях досега, изпробвайки всеки кандидат за версия веднага щом бъде пуснат, е напълно безопасно да преминете към PHP 7 веднага щом бъде пуснат. Никога не съм забелязал някакво странно поведение или срив, които не са по моя вина. Въпреки факта, че това нова версиятой не носи много несъвместими промени, тоест като цяло можете да го третирате просто като PHP 5.7, само че много по-бързо.

А скоростта е наистина впечатляваща, дори невероятна. Например, прост сайт на PHPixie работи почти три пъти по-бързо, почти изравнявайки скоростта на Phalcon на PHP 5.6, няколко сайта на Wordpress показаха стабилно увеличение на скоростта с фактор два. Ако вземете предвид неотдавнашния доклад от Google, че дори 10% загуба на производителност при зареждане на страницата води до значителна загуба на клиенти, тогава ако можете лесно да ускорите сайта си наполовина само чрез актуализиране на PHP, ще получите повече продажби, без да харчите нищо. Помнете това, когато убеждавате вашия мениджър да премине към PHP 7. Нищо не убеждава по-добре от обема на продажбите.

Няколко бележки

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

E_STRICTгрешките се прекласифицират като други типове грешки. Ако преди сте ги скрили или сте ги игнорирали, сега те ще започнат да се появяват заедно с други. Например статичното извикване на нестатични методи вече хвърля E_ОТТЕГЛЕНОкоето създаде куп проблеми с Joomla 2.5, която по някаква причина прави това доста често. Също така несъвместимото наследство вече се класифицира като E_ПРЕДУПРЕЖДЕНИЕ. Wordpress е тестван за работа с PHP 7 от февруари, така че няма проблеми със самия него, но няколко плъгина се оказаха несъвместими.

за всекисега винаги работи с копие на масива, така че никакви промени в масива по време на итерация няма да повлияят на самата итерация. Всъщност в много случаи така или иначе работеше и самият случай е доста рядък, но все пак попаднах на него в един от плъгините.

Сега $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. Процесът не е никак труден и вече са налични пакети за всички популярни дистрибуции. Така че дори и да чакате стабилна версия (сега не много), няма причина да не подготвите сайтовете си за миграция преди време.

И така, имате стар, но много скъп уебсайт, който решавате от съжаление (или може би след повторно четене на Habr) да прехвърлите на 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

Да приемем, че сайтът използва бази данни и виждате грешки като тези:

Фатална грешка: Неуловена грешка: Извикване на недефинирана функция mysql_connect()

Това е така, защото в съвременните версии на PHP (започвайки от PHP 5.5.0) оригиналното MySQL разширение не се поддържа. Разработчиците препоръчват използването на MySQLi или PDO. Нека опитаме да преминем към MySQLi, лесно е:

Да приемем, че сайтът е написан с помощта на процедурен подход, който е класически глупав код и сега се смята от мнозина за кратко и ефективно решение. В този случай следната наследена конструкция за свързване към базата данни:

$link = mysql_connect('localhost', $user, $password)
mysql_select_db($dbname, $link)
mysql_query('задайте имена cp1251')

може да се замени с:

$link = mysqli_connect('localhost', $user, $password, $dbname)
mysqli_query($link, 'набор имена 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"

Регулярни изрази

Може също да видите грешки от следния тип:

Предупреждение: preg_replace(): Модификаторът /e вече не се поддържа, вместо това използвайте preg_replace_callback

Това означава, че модификаторът /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 и първото намерено срещане се предава на нея като аргумент. Това, което беше \\1 в preg_replace (първото намерено срещане), ще стане $съвпадения (ако имаше повече аргументи, тогава ще има $съвпадения, $съвпадения и т.н.).

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

Беше така:

$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. Симптомите са както следва:

Фатална грешка: Неуловена грешка: Извикване на недефинирана функция ereg_replace()

Ако регулярният израз в ereg_replace е прост, тогава можете да го получите, като просто зададете граничните знаци, като това:

$str=ereg_replace("[\r\t\n]", "",$str)
$str=preg_replace(“/[\r\t\n]/”,””,$str)

Подобен симптом:

Фатална грешка: Неуловена грешка: Извикване на недефинирана функция split()

$var_pair=split("=",$tmp)

$var_pair=explode("=",$tmp)

Ако регулярният израз е по-сложен, тогава се опитваме да го преобразуваме в preg_split.

Ако нещо не се получи или вашият случай изобщо не е подобен на нашите примери, напишете коментари и ние ще се опитаме да го разберем заедно.

За да оставите коментари към публикацията, влезте в профила си в социалните мрежи VKontakte/FaceBook или акаунта си в Google/Yandex.

Ако намерите грешка, моля, изберете част от текста и натиснете Ctrl+Enter.