Перейти к содержимому

Какая версия php сейчас актуальна

  • автор:

Список изменений

Следующие изменения были произведены с функциями встроенных модулей.

Version Function Description

User Contributed Notes

There are no user contributed notes for this page.

  • Appendices
    • История PHP и смежных проектов
    • Миграция с PHP 8.2.x на PHP 8.3.x
    • Миграция с PHP 8.1.x на PHP 8.2.x
    • Миграция с PHP 8.0.x на PHP 8.1.x
    • Миграция с PHP 7.4.x на PHP 8.0.x
    • Миграция с PHP 7.3.x на PHP 7.4.x
    • Миграция с PHP 7.2.x на PHP 7.3.x
    • Миграция с PHP 7.1.x на PHP 7.2.x
    • Миграция с PHP 7.0.x на PHP 7.1.x
    • Миграция с PHP 5.6.x на PHP 7.0.x
    • Миграция с PHP 5.5.x на PHP 5.6.x
    • Отладка в PHP
    • Опции конфигурации
    • Директивы php.ini
    • Список/классификация модулей
    • Список псевдонимов функций
    • Список зарезервированных слов
    • Список типов ресурсов
    • Список доступных фильтров
    • Список поддерживаемых транспортных протоколов
    • Таблица сравнения типов в PHP
    • Список меток (tokens) парсера
    • Руководство по именованию
    • Об этом руководстве
    • Creative Commons Attribution 3.0
    • Алфавитный список
    • Список изменений
    • Copyright © 2001-2023 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    Вышел PHP 8.2: разбираем главные изменения

    Вместе с PHP-разработчиками Александром Макаровым (@SamDark), Валентином Удальцовым (@vudaltsov) и наставником Хекслета по PHP Владленом Гилязетдиновым (@funkylen) разбираемся, какие новые фичи появились в PHP 8.2, насколько эти изменения глобальны и какую роль в них сыграл проект РHP Foundation.

    Эта статья — саммари стрима YouTube-канала PHP Point.

    Кстати, ежегодный опрос русскоязычного PHP-сообщества с итогами года запущен! Результатами поделимся в конце января.

    Главные изменения в PHP 8.2

    Readonly-классы

    Поля readonly сделали еще до версии 8.2. Раньше писать в них код и читать его можно было только в конструкторе. А теперь для этого не нужно помечать каждое поле — достаточно отметить весь класс как readonly .

    Как выглядел код в предыдущих версиях PHP:

    class BlogData < public readonly string $title; public readonly Status $status; public function __construct(string $title, Status $status) < $this->title = $title; $this->status = $status; > >

    Как выглядит код в PHP 8.2:

    readonly class BlogData < public string $title; public Status $status; public function __construct(string $title, Status $status) < $this->title = $title; $this->status = $status; > >

    Но у фичи есть особенности:

    1. Readonly -классы недоступны для классов с необъявленными типами.
    2. Также readonly -классы недоступны для классов со статическими свойствами.
    3. Если мы захотим наследоваться от старого readonly -класса, новый тоже должен быть Readonly.

    Типы в виде дизъюнктивной нормальной формы (ДНФ)

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

    Как выглядел код в предыдущих версиях PHP:

    class Foo < public function bar(mixed $entity) < if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) < return $entity; >throw new Exception('Invalid entity'); > >

    Как выглядит код в PHP 8.2:

    class Foo < public function bar((A&B)|null $entity) < return $entity; >>

    Пожелание от меня: будьте осторожны с этой фичей. Она позволяет много методов объединять в один. Если бы я программировал приложения, то так не делал бы. А вот во фреймворках она будет очень кстати, потому что иногда, ради красивой API, мы сознательно жертвуем такой вот правильностью — используем подход с mixed -типами в сигнатуре.

    Самостоятельные типы null, false и true

    Это изменение единогласно приняла вся команда разработчиков PHP, так как в ядре PHP есть методы, классы и функции, которые возвращают false или true .

    Если у вас метод никогда не возвращает false , то теперь можно указать, что он возвращает true или значение. Или наоборот, null и значение, или false и значение. Фича удобная и делает язык немного строже.

    Как выглядел код в предыдущих версиях PHP:

    class Falsy < public function almostFalse(): bool < /* . */ *>public function almostTrue(): bool < /* . */ *>public function almostNull(): string|null < /* . */ *>>

    Как выглядит код в PHP 8.2:

    class Falsy < public function alwaysFalse(): false < /* . */ *>public function alwaysTrue(): true < /* . */ *>public function alwaysNull(): null < /* . */ *>>

    Модуль «Random»

    Random — это целый пак разных интерфейсов. Особенности фичи:

    1. Разработчики сделали объектно-ориентированный API.
    2. Каждый инстанс независимый — то есть для разных целей можно инстанцировать n-штук псевдослучайных генераторов, которые никогда не пересекутся. Стало более безопасно.
    3. Mersenne twister заменен на интерфейс Engine. Раньше mt_rand() надо было инициализировать. Он был нужен не для всяких крипто-фич, а для того чтобы, например, сортировать массивы в случайном порядке. mt_rand() работал достаточно быстро, поэтому использовать его для утилитарных задач было неплохо. Теперь его заменили на интерфейс Engine, который предоставляет готовые реализации.

    Как выглядит код в PHP 8.2:

    use Random\Engine\Xoshiro256StarStar; use Random\Randomizer; $blueprintRng = new Xoshiro256StarStar( hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true) ); $fibers = []; for ($i = 0; $i < 8; $i++) < $fiberRng = clone $blueprintRng; // Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling // 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed. $blueprintRng->jump();

    Константы в трейтах

    Теперь можно объявлять константы внутри трейтов. Особенность фичи — нельзя получить доступ к константе через имя трейта, но можно через класс, который использует этот трейт.

    Очень логичное изменение, на мой взгляд. Трейт сам по себе — это копипаст. Копипаст — штука опасная, но иногда полезная (у нас есть принцип «don’t repeat yourself»). И трейт — это один самых неинвазивных способов что-то повторить, который легко потом отрефакторить.

    Как выглядит код в PHP 8.2:

    trait Foo < public const CONSTANT = 1; >class Bar < use Foo; >var_dump(Bar::CONSTANT); // 1 var_dump(Foo::CONSTANT); // Error

    Динамические свойства объявлены устаревшими

    В классах PHP можно было динамически присваивать значения свойствам, которые мы не объявили ранее, и эти свойства появлялись после классов.

    Теперь так сделать нельзя — будет появляться Deprecation notice . Но если сильно нужно, динамическими свойствами можно пользоваться, если пометить класс аннотацией #[\AllowDynamicProperties] . В экземплярах stdClass динамические свойства по-прежнему можно использовать.

    Как выглядел код в предыдущих версиях PHP:

    class User < public $name; >$user = new User(); $user->last_name = 'Doe'; $user = new stdClass(); $user->last_name = 'Doe';

    Как выглядит код в PHP 8.2:

    class User < public $name; >$user = new User(); $user->last_name = 'Doe'; // Deprecated notice $user = new stdClass(); $user->last_name = 'Doe'; // Still allowed

    #[\SensitiveParameter]

    Это маленькая, но очень классная фича, которая мельком упоминается в официальном анонсе.

    Параметры в методах теперь можно обозначить как #[\SensitiveParameter] . Ниже в коде так отмечен параметр $secret , и в логах вместо значения параметра secret написано (Object(SensitiveParameterValue) .

    function sensitiveParametersWithAttribute( #[\SensitiveParameter] string $secret, string $normal )
    Exception: Error! in example.php:15 Stack trace: #0 example.php(25): sensitiveParametersWithAttribute(Object(SensitiveParameterValue), 'normal') #1

    Считаю это изменение очень крутым, так как теперь у нас не будут утекать всякие ключи от API, пароли от базы. Команда разработчиков PHP практически единогласно проголосовала за эту фичу.

    Какие еще изменения произошли

    Расширение enum в константах

    Раньше, чтобы использовать enum , надо было дублировать их значение. Это было очень неприятно: enum есть, а в объявлениях констант нельзя было из них что-то использовать. Теперь можно: новая фича уравнивает весь синтаксис. Классно, что язык эволюционирует в сторону удобства и большей консистентности.

    const C = [self::B->value => self::B];
    iterator_() + iterables

    Теперь можно передавать в методы iterator_() тип \Traversables . Это просто замечательно, потому что раньше приходилось проверять, является ли аргумент объектом типа \Traversable , и если да, то надо было его конвертить. В PHP 8.2 можно больше не проводить эти проверки, что уменьшает количество кода и делает его более приятным и читаемым.

    Расширена рефлексия
    • Можно узнать, анонимный ли метод — ReflectionFunction::isAnonymous()
    • Можно узнать, есть ли у метода прототип — ReflectionMethod::hasPrototype()
    Новые функции memory_reset_peak_usage

    Функции сбрасывают статистику по пиковому использованию памяти. Это очень полезно для EventLoop на PHP, Roadrunner и Swoole — мы сможем скинуть потребляемую память после запроса и измерить ту, которая ушла конкретно на один запрос.

    Что признали устаревшим или убрали
    • Интерполяция в строках вида $<>
    • Не рекомендуется использовать функции utf8_encode и utf8_decode
    • Функции strtolower и strtoupper теперь не учитывают локаль — это круто, потому что версии PHP, установленные в двух системах Linux, могут работать по-разному из-за выбранной дефолтной локали.
    • Убрали много форматов callable :
    • “self::method”
    • “parent::method”
    • “static::method”
    • [“self”, “method”]
    • [“parent”, “method”]
    • [“static”, “method”]
    • [“Foo”, “Bar::Method”]
    • [new Foo, “Bar::Method”]

    Мое мнение — на PHP 8.2 определенно стоит переходить хотя бы из-за крутых улучшений синтаксиса. Он все еще делает код более читаемым и понятным. Также разработчики пофиксили разные мелкие баги, которые мы не упомянули, но их было много.

    Какие изменения PHP 8.2 еще в разработке

    Некоторые разработчики считают, что в новую версию PHP добавили очень мало изменений. На самом деле, в РHP 8.2 было много саппортных вещей: код вычищали, из него что-то убирали. Каждое изменение, которое вводили разработчики, непросто описать в фичах. Да и вряд ли всем будет интересно, какие куски кода рефакторили. Так что по объему работы релиз 8.2 не отличается от предыдущих релизов. Просто в нем чуть меньше фич.

    Большие усилия к разработке версии 8.2 приложили ребята из PHP Foundation — проекта, который финансирует разработчиков, готовых контрибьютить в PHP.

    PHP Foundation создали много известных компаний, среди которых JetBrains, Automattic, Laravel. Проект запустили 22 ноября 2021 года, и за год коллектив из десяти администраторов-добровольцев и шести разработчиков внесли почти половину коммитов в ядро языка PHP и расширения.

    В новую версию языка PHP Foundation имплементировал readonly -классы, самостоятельные типы null , false и true , тип true , типы в виде дизъюнктивной нормальной формы и получение свойств перечислений в константных выражениях. Также он объявил интерполяцию в строках вида $<> устаревшей.

    Документация по PHP 8.2 еще в разработке, и разработчик PHP Foundation Джордж П. Баньярд сейчас отслеживает прогресс в изменениях. Вместе с командой он обсуждает эти нововведения:

    • Автоматическая имплементация для enum Stringable
    • Ассиметричная видимость
    • Получение констант из класса
    • Более понятные ошибки Date/Time
    • Доработки по Readonly
    • Работа с инициализаторами произвольных статических переменных.

    Помочь составить документацию может каждый из нас — это, как говорится, good first issue (несложные задачи, выполнить которые под силу новичкам).

    Также PHP Foundation планирует выдвинуть на обсуждение новые изменения в будущем релизе PHP 8.3.

    Актуален ли PHP в 2021 году?

    Фокус внимания давно переместился с PHP на JavaScript и Python. Тем не менее у него выходят новые версии, а тесты производительности говорят о неплохом прогрессе. Насколько актуален PHP сегодня? Под катом — размышления разработчика, который продолжает отдавать ему предпочтение.

    Краткая история PHP

    PHP разработал Расмус Лердорф в 1994 году. Лердорф создал набор скриптов, которые отслеживали посещения его онлайн-резюме, и назвал их Personal Home Page Tools («инструменты личной домашней страницы»). Со временем название превратилось в PHP Tools. Он пополнял этот набор новыми инструментами, а потом решил переписать их: добавил взаимодействие с базами данных и многое другое. Так набор превратился во фреймворк.

    Дальше эти инструменты продолжали эволюционировать в еще более сложные примитивы, а после публикации кода в open source в 1995 году число пользователей стало расти заметно быстрее. Если вас интересуют подробности этой истории, вы можете найти их на официальном сайте PHP.

    Последняя версия языка сейчас — PHP 8.0.

    А что не так с PHP?

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

    Слабая типизация

    Лично мне в этом языке не нравится слабая типизация, позволяющая сочетать разные типы и выполнять их неявные преобразования. Рассмотрим такой пример:

    echo "1" + 3; echo 1 + "3"; echo "1" + "3";

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

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

    Отсутствие пространств имен

    Поддержка пространств имен была добавлена в PHP в версии 5.3. В более старых проектах приходилось создавать собственные типы пространств имен, в основном при помощи добавления пространств имен к названиям классов и методов. Из-за этого приходилось использовать повсюду абсурдно длинные имена.

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

    В более поздних версиях языка таких проблем нет.

    Противоречивые функции стандартной библиотеки

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

    Вот некоторые примеры противоречивости наименований в строковых методах из документации:

    • strpos(string $haystack, string $needle, int $offset = 0): int|false : находит позицию первого вхождения подстроки в строке;
    • strsplit(string $string, int $length = 1): array : преобразует строку в массив;
    • explode(string $separator, string $string, int $limit = PHP_INT_MAX): array : разделяет строку по граничной строке.

    Три разные функции: одна с префиксом str , вторая с префиксом str_ , а третья без префикса. Аргумент $string является первым для str_split , но вторым для explode . Вы можете изучить все строковые методы в документации — этому паттерну следует множество функций, то есть среди них нет особого единообразия.

    Суперглобальные переменные

    Это больше относится к личным предпочтениям — я ненавижу использовать глобальные переменные, а следовательно, и суперглобальные. Когда находишь какие-то старые самодельные проекты, особенно высока вероятность встретиться с печально известными переменными типа $SERVER или $REQUEST . Не поймите меня неправильно: иногда они очень полезны и время от времени их нужно использовать. Однако для безопасного использования этих значений первым делом нужно инкапсулировать их в многократно используемые классы. Если этого не сделать, то взаимодействие со значениями или внесение изменений в крупный проект будет очень сложной задачей, ведь с этими значениями связано множество скрытых зависимостей.

    И что хорошего в PHP?

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

    Type hints

    Это один из моих любимых способов модернизации старого кода на PHP: использование необязательных type hints, выполняющих преобразование типов, а также обеспечивающих документацию кода. Рассмотрим простую функцию:

    function isValueSomething($value) <>

    Если добавить type hints, код станет таким:

    function isValueSomething(string $value): bool <>

    Просто увидев сигнатуру функции, мы понимаем, что она ожидает строковое значение и вернет булев-результат. Можно добавить, что здесь полезно было бы применить правильное наименование, однако эти type hints гарантируют, что значения будут именно указанных типов и предоставляют IDE возможность автодополнения и статического анализа с предупреждениями и другими полезными вещами.

    С версии 7.4 PHP позволяет задавать и типизированные свойства для классов:

    class Person

    Это означает, что у объектов Person будут строковые имя и фамилия, возраст в integer и допускающая пустое значение строка для должности. Чем больше классов — тем полезнее эта возможность.

    Улучшения синтаксиса

    В поздних версиях PHP появилось много синтаксических улучшений:

    • стрелочные функции: fn ($x, $y) => $x + $y;
    • оператор объединения с неопределенным значением: $value = $array[‘key’] ?? ‘default value’;
    • присваивание с неопределенным значением: return $cache[‘key’] ??= computeSomeValue(‘key’);
    • расширение массивов: $first = [‘a’, ‘b’]; $second = [‘c’, ‘d’]; $final= […$first, …$second];
    • именованные аргументы: array_fill(start_index: 0, num: 100, value: 50);
    • разделитель числовых литералов: 299_792_458

    Помимо синтаксических он содержит возможности для комплексных улучшений.

    Constructor promotion

    Взгляните на класс Person :

    class Person < private string $firstName; private string $lastName; protected int $age; public ?string $job; public function __construct( string $firstName, string $lastName, int $age, ?string $job )< $this->firstName = $firstName; $this->lastName = $lastName; $this->age = $age; $this->job = $job; > >

    Вместо этого избыточно многословного кода PHP 8 поддерживает возможность написания такого кода:

    class Person < public function __construct( private string $firstName, private string $lastName, protected int $age, public ?string $job )<>>

    Удобно, не так ли?

    Nullsafe-оператор

    Этот оператор существовал в некоторых других языках наподобие JavaScript, но PHP его не поддерживал. Взгляните на код, который я взял из документации PHP:

     else < $user = $repository->getUser(5); if (is_null($user)) < $result = null; >else < $result = $user->name; > >

    Именно так писали логику в старых версиях PHP для учета проверок на null. Новый nullsafe-оператор позволяет свести это к такому коду:

    Разве не великолепно?

    Объединенные типы

    Хоть для меня это и не самая любимая штука, она все равно ценна в случаях, когда уже есть несколько возможных типов без type hints. Объединения позволяют определять в качестве вариантов несколько типов значений. Благодаря объединениям становится работающим вот такой код:

    function doSomething(int|string $value): bool|array <>

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

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

    У меня нет четких данных для сопоставления производительности с другими языками, но по сравнению с предыдущими версиями скорость работы кода PHP заметно выросла. В дополнение к рывку, сделанному PHP 7 по сравнению с PHP 5.6, все последующие релизы вносили улучшения, и эта тенденция продолжается. Проведенные Phoronix бенчмарки демонстрируют, что последняя версия PHP 8 в три с лишним раза быстрее PHP 5.6. В посте по ссылке выше есть подробные тесты, так что их стоит изучить.

    В дополнение к этим бенчмаркам Kinsta также провела реальные испытания с WordPress. Вот результат для WordPress 5.3.

    Точные цифры замеров таковы:

    • Результаты бенчмарка WordPress 5.3 с PHP 5.6: 97,71 запросов/с
    • Результаты бенчмарка WordPress 5.3 с PHP 7.0: 256,81 запросов/с
    • Результаты бенчмарка WordPress 5.3 с PHP 7.1: 256,99 запросов/с
    • Результаты бенчмарка WordPress 5.3 с PHP 7.2: 273,07 запросов/с
    • Результаты бенчмарка WordPress 5.3 с PHP 7.3: 305,59 запросов/с
    • Результаты бенчмарка WordPress 5.3 с PHP 7.4: 313,42 запросов/с

    Пока в эти бенчмарки не включен PHP 8, однако видно, что даже версия 7.4 способна обрабатывать в три раза больше запросов по сравнению с 5.6, и это серьезное улучшение.

    Вывод

    В целом PHP за последние годы значительно улучшили, и с ним стало удобно работать. Я профессионально пишу на Golang, PHP и Python, но больше всего опыта у меня в PHP, поэтому я могу быть пристрастен. Однако, по моему мнению, PHP нашел идеальный баланс между гибкостью и поддерживаемостью.

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

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

    • Блог компании Leader-ID
    • WordPress
    • Веб-разработка
    • PHP

    Версии PHP: зачем их обновлять и чем они различаются

    Почти 80% всех существующих сайтов, по данным W3Techs, работают на базе языка программирования PHP. Значительную их часть составляют сайты, созданные с помощью WordPress и других популярных CMS. Однако, несмотря на такую распространнёность, не все владельцы сайтов знают о необходимости переходить с устаревших версий PHP на более актуальные. Что отражается на качестве работы сайтов.

    Кратко о версиях PHP

    Какие версии PHP считаются актуальными, а какие — устаревшими? Чтобы разобраться в этом, рассмотрим этапы жизненного цикла версий этого языка:

    1. Релиз. Выпускается новая версия PHP, которая прошла все этапы предварительного тестирования и подходит для использования в «боевых условиях».
    2. Активная поддержка. В течение двух лет после релиза версия продолжает совершенствоваться. Выходят регулярные обновления, вносятся корректировки и исправляются баги. Обеспечивается полная безопасность версии.
    3. Минимальная поддержка. Ровно через два года после релиза работа по развитию версии прекращается. В течение следующего года происходят только критические обновления, касающиеся серьёзных угроз безопасности.
    4. Завершение жизненного цикла. Через год критических обновлений защиты версия перестаёт поддерживаться полностью. Однако ей можно продолжать пользоваться, но уже на свой страх и риск.

    На момент публикации этого материала продолжают поддерживаться три версии PHP:

    • 7.4 (дата релиза — 28 ноября 2019 года, самая актуальная версия);
    • 7.3 (дата релиза — 6 декабря 2018 года, активная поддержка подходит к концу);
    • 7.2 (дата релиза — 30 ноября 2017, активно не поддерживается, важные обновления безопасности скоро перестанут выходить).

    Версии 7.1, 7.0 и все версии PHP 5 больше не обновляются. А уже в конце 2020 года самой актуальной станет версия 8.0.

    А что насчёт PHP 6? Если вы не знаете, почему шестые версии здесь не упоминаются, то сейчас поясним.

    PHP 6: строили, строили, но не построили

    На разработку версии 6.0 было потрачено немало времени. Предполагалось, что самым важным нововведением в ней станет поддержка символов Юникода, благодаря которой возможности языка были бы расширены. Однако разработчики PHP 6 столкнулись со множеством трудностей, что вынудило их постепенно отказаться сначала от внедрения Юникода, а затем и вообще от запуска версии 6.0.

    Пока шла работа над PHP 6, на эту тему было выпущено немало статей и книг. И представление о PHP 6 как о версиях языка с внедрённым Юникодом уже успело устояться в IT-сообществе. Поэтому новому поколению языка, пришедшему на смену PHP 5, было решено присвоить номер 7.

    PHP 7: обновление, которое ждали больше 10 лет

    Первая версия PHP 7 была представлена ещё в конце 2015 года, но до сих пор почти половина сайтов в мире, по информации WTechs, не перешли на PHP 7 и остаются на PHP 5. Каких возможностей лишены те, кто всё ещё не обновился?

    Версия 7.0 основывалась на новой технологии phpng — PHP Next Generation, «Следующее поколение PHP». Она создавалась с целью увеличить производительность языка без снижения совместимости. В реальной практике PHP 7 оказался примерно в 2 раза быстрее PHP 5, а разница в производительности на синтетическом тесте bench.php составила вовсе 14 раз.

    С заботой о пользователях мобильных гаджетов разработчики также поработали над исполнением движка и уменьшили потребление памяти при работе PHP. Также с помощью Abstract syntax tree (AST) операционный код стал более производительным. И в целом код на PHP 7 стал чище, понятнее и удобнее.

    Помимо внедрения нововведений, в версии 7.0 изменили или вовсе убрали устаревшую и ненужную функциональность. С одной стороны, это несколько нарушило совместимость языка с ранее созданным и необновлённым ПО. Но с другой, принятые меры позволили сделать настоящий прорыв в развитии PHP.

    PHP 8: взгляд в будущее

    Версия 8.0 активно разрабатывается в данный момент, но о ней уже кое-что известно. Планируется, что в новейших версиях PHP будет генерироваться меньше кода. Для этого будет использоваться технология JIT (Just in Time). С её помощью при выполнении приложения весь код будет не компилироваться заново, а частично заимствоваться из уже скомпилированных версий.

    Компиляции станет меньше и благодаря технологии FFI (Foreign Function Interface), которая упрощает вызов функций, написанных на разных компилируемых языках программирования. Благодаря JIT и FFI производительность PHP 8 должна ощутимо повыситься по сравнению с PHP 7.

    Релиз первой альфа-версии 8.0 намечен на лето этого года. Затем традиционно будут представлены несколько альфа- и бета-версий, а также релизов-кандидатов, после чего 3 декабря 2020 года ожидается выпуск финального варианта.

    Кратко об обновлении PHP

    Какую версию PHP лучше всего использовать? Конечно же, самую актуальную на данный момент. Тогда вы всегда будете получать:

    • потенциал для роста производительности сайта;
    • надёжную защиту от вредоносных атак, использующих уязвимости в PHP;
    • самый широких выбор ПО и плагинов, совместимых с сайтом.

    О работе с PHP на VPS мы пока говорить не будем, так как для этого нужен отдельный материал. Поэтому дальше мы дадим рекомендации пользователям виртуального и специализированного хостинга.

    Узнайте, какая версия PHP используется на вашем сайте. Эта информация доступна в настройках веб-сервера: например, на хостинге «Джино» они расположены здесь). Владельцы сайтов на WordPress могут увидеть текущую версию PHP в панели администратора, в разделе Инструменты / Здоровье сайта / Информация. Также вы можете написать этот скрипт, разместить его в файлах сайта и обратиться к нему из браузера:

    В результате будет показана информация о версии.

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

    1. Убедитесь, что у вас сохранена свежая резервная копия файлов сайта.
    2. Проверьте совместимость используемого ПО, фреймворков, библиотек, плагинов с выбранной вами версией PHP. Если что-то из этого не совместимо с ней, убирайте и заменяйте на более современные аналоги.
    3. Измените версию PHP на хостинге, через настройки сервера в контрольной панели или через запрос в техподдержку.
    4. После обновления протестируйте все функции сайта, при тестировании проверяйте лог на предмет «Fatal error» и других ошибок, которых раньше не было. Если все функции работают, а на страницах сайта появляются предупреждения PHP — отключите отображение ошибок.
    5. Если после обновления возникли серьёзные нарушения в работе сайта, верните старую версию PHP. Разберитесь в проблемах сами или обратитесь за помощью к специалистам.

    Чтобы переход на новую версию PHP никогда не составлял большого труда, постоянно адаптируйте свой сайт под последнюю поддерживаемую версию языка. А также используйте регулярно обновляемые плагины и ПО, избавляясь от всего, что не обновлялось больше года и не подлежит использованию с актуальными версиями PHP.

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

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