Как подготовить сайт WordPress к переходу на PHP 8
Опубликовано: 2022-07-06Для сайтов WordPress требуется PHP, и по мере развития PHP WordPress не отставал. Совсем недавно PHP 7.4 был версией PHP по умолчанию на платформе WordPress VIP. Однако, поскольку поддержка безопасности PHP 7.4 заканчивается в ноябре 2022 года, сайты WordPress необходимо будет обновить для обеспечения надежной безопасности. По этой причине платформа WordPress VIP будет переводить все наши клиентские приложения на PHP 8.0.
Далее следует описание изменений и шаги, которые могут предпринять как наши клиенты, так и другие пользователи, использующие WordPress на других платформах, для подготовки.
Оглавление
- История PHP 8.0
- Новые особенности
- Распространение поддержки в сообществах PHP и WordPress.
- Как найти проблемы совместимости PHP 8.0
- Используйте PHP_CodeSniffer со стандартом PHPCompatibility
- Устранение известных предупреждений PHP, которые являются фатальными ошибками PHP в PHP 8.0.
- Создавайте автоматизированные тесты
- Используйте PHPStan/Psalm или другой инструмент статического анализа
- Как начать работу с PHP 8.0 на WordPress VIP
- Запустите приложение локально
- Проверьте бота анализа кода VIP на запросах на вытягивание
- Включите PHP 8 в ваших VIP-приложениях WordPress
- Воспользуйтесь проактивной помощью
- А как насчет PHP 8.1?
История PHP 8.0
Выпущенный в ноябре 2020 года PHP 8.0 содержит несколько улучшений и функций, которые сделали новый код (и более короткий код) более устойчивым к ошибкам.
Большинство разработчиков найдут существенные преимущества в PHP 8.0. Однако, как основная версия, она содержит несколько критических изменений. Это делает переход с PHP 7.4 на PHP 8.0 более сложным, чем, например, переход с PHP 7.3 на PHP 7.4. В частности, в ядро PHP было внесено 49 критических изменений, а в PHP 8 в целом — 169, в том числе в библиотеках и расширениях, на которые может полагаться ваш код.
Хорошей новостью является то, что как только организации перейдут на PHP 8.0, они будут получать поддержку безопасности от основного проекта PHP до ноября 2023 года. После этой даты организации необходимо будет перейти на PHP 8.1, второстепенный выпуск, требующий гораздо меньшего изменения.
Новые особенности
PHP 8.0 был разработан, чтобы 1) исправить крайние случаи и несоответствия, чтобы сделать PHP более надежным и предсказуемым языком сценариев, и 2) предоставить новые функции для улучшения языка в целом. К ним относятся несколько новых синтаксисов, которые:
- Упростите написание строго типизированного кода, например, типы объединения,
static
иmixed
типы, интерфейсStringable
и изменения в обработке чисел. - Сократите объем кода, который необходимо поддерживать, например оператор nullsafe, повышение свойства конструктора, оператор
match
и не захватывающие перехваты. - Упростите код, например разрешив
::class
для объектов, завершающую запятую в списках параметров,str_contains()
,str_starts_with()
иstr_ends_with()
, выражение throw, атрибуты.
Он также включает именованные параметры. Однако стоит отметить, что ядро WordPress не претендует на совместимость с этой функцией. Таким образом, хотя вы можете вызывать собственные пользовательские функции с именованными параметрами, вам не следует вызывать функции WordPress, так как в будущем имена параметров могут измениться без предупреждения.
Распространение поддержки в сообществах PHP и WordPress.
Всякий раз, когда выпускается новая версия PHP, включающая новый синтаксис, требуется время, чтобы новый синтаксис стал поддерживаться в сообществах PHP и WordPress.
Инструменты PHP-разработчика
Инструменты разработки PHP, такие как Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug и различные IDE, должны распознавать новый синтаксис новой версии PHP. Хотя PHP постоянно развивается, может пройти некоторое время, прежде чем будет доступна полная экосистема вокруг новой версии. Однако часто инструменты могут быть готовы к работе к тому времени, когда будет готов окончательный выпуск, потому что работа по разработке проводилась на основе альфа- , бета -версий и выпусков-кандидатов , которые были доступны заранее. Все эти и многие другие инструменты теперь поддерживают PHP 8.0, что делает его хорошим выбором для разработки кода PHP и, в частности, для разработки WordPress.
Ядро WordPress
Далее, ядро WordPress должно поддерживать PHP 8.0. Проект WordPress имеет долгую историю совместимости с новыми версиями PHP к моменту их выпуска. Согласно этому хорошо написанному сообщению на Make WP, WordPress имеет «бета-совместимость» с PHP 8.0 с момента выпуска WordPress 5.6 в декабре 2020 года. Что означает «бета-совместимость»? Это означает, что WordPress может нормально работать на PHP 8.0, но такие функции, как объявление строгих типов в основных файлах WordPress или использование именованных параметров с основными функциями WordPress, не поддерживаются.
VIP-платформа WordPress
Платформа WordPress VIP поддерживает PHP 8.0 (и PHP 8.1) с мая 2022 года, включая набор плагинов и функций, которые позволяют платформе удовлетворять потребности предприятия.
Сторонние плагины
WordPress имеет десятки тысяч плагинов, а уровень поддержки PHP 8.0 сильно различается. Например, новые зарезервированные слова могут по-прежнему использоваться подключаемым модулем, или параметры, передаваемые в собственные функции PHP, могут иметь не тот тип, который сейчас ожидается. Таким образом, сторонние плагины могут быть одной из областей, где несовместимость с PHP 8.0 может повлиять на ваше приложение.
Ниже вы можете узнать, как проверить некоторые из этих несовместимостей. Варианты включают в себя просьбу вышестоящего лица/команды внести исправления и сделать новый выпуск, или иметь внутреннюю команду разработчиков или агентство, например, одного из наших рекомендуемых партнеров, для создания форка плагина и внесения исправлений самостоятельно.
Пользовательские плагины
Почти каждый клиент на платформе WordPress VIP использует один или несколько пользовательских плагинов. Как и сторонние плагины, их тоже нужно проверять на совместимость. Как правило, лучше всего обращаться к первоначальным разработчикам с просьбой устранить обнаруженные проблемы.
Сторонние или пользовательские темы
Хотя плагины являются наиболее вероятным источником проблем совместимости, не забывайте, что сторонние и пользовательские темы также должны быть совместимы с PHP 8.0. Тот же подход к проверке совместимости кода плагина применим и к коду темы.
Как найти проблемы совместимости PHP 8.0
Существует четыре основных подхода, которые команды разработчиков могут использовать для проверки кода с целью выявления проблем совместимости:
- Используйте PHP_CodeSniffer со стандартом PHPCompatibility.
- Устраните известные предупреждения PHP, которые являются неустранимыми ошибками PHP в PHP 8.0.
- Создавайте автоматизированные тесты.
- Используйте PHPStan/Psalm или другой инструмент статического анализа.
Используйте PHP_CodeSniffer со стандартом PHPCompatibility
PHP_CodeSniffer (PHPCS) токенизирует файлы PHP и обнаруживает нарушения определенного набора стандартов кодирования. Существуют пакеты для стандартов кодирования WordPress и наши собственные стандарты кодирования VIP (которые мы рекомендуем клиентам использовать).
Существуют также пакеты под названием PHPCompatibility и PHPCompatibilityWP, и эти стандарты анализируют кодовую базу на предмет совместимости между версиями PHP.
Поскольку результаты зависят от возможностей и готовности инструмента, важно использовать ветку develop
PHPCompatibility до тех пор, пока не будет выпущена версия 10. Версия 10 будет содержать сниффы, связанные с совместимостью с PHP 8.0 (и PHP 8.1). См. наши документы для получения инструкций о том, как настроить вашу конфигурацию для использования ветки develop
. Как только будет выпущена версия 10, вы сможете использовать эту версию.
Пакет PHPCompatbilityWP строится поверх пакета PHPCompatibility, но отключает несколько проверок элементов обратной совместимости, которые содержит само ядро WordPress.
После настройки PHPCS и PHPCompatibility/PHPCompatibilityWP вы можете запустить проверку:
phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>
<path-to-code>
может быть отдельным настраиваемым или сторонним плагином или темой, если вы хотите начать с малого, или целым репозиторием, если вы хотите увидеть все нарушения, которые необходимо расследовать и устранять.
Этапы сканирования не обнаружат все возможные проблемы совместимости версий PHP (например, неправильные типы значений времени выполнения), но они помогут определить наиболее распространенные проблемы, связанные с синтаксисом.
Устранение известных предупреждений PHP, которые являются фатальными ошибками PHP в PHP 8.0.
В PHP 8.0 некоторые предупреждения движка были переклассифицированы, где предупреждения стали фатальными ошибками и исключениями типа ошибок (а некоторые уведомления стали предупреждениями). Тексты предупреждений PHP, которые следует искать в PHP 7.4:
-
Attempt to assign property '*' of non-object
-
Attempt to modify property '*' of non-object
-
Attempt to increment/decrement property '*' of non-object
-
Creating default object from empty value
-
Cannot use a scalar value as an array
-
Cannot add element to the array as the next element is already occupied
-
Cannot unset offset in a non-array variable
-
Only arrays and Traversables can be unpacked
-
Invalid argument supplied for foreach()
-
Illegal offset type
-
Illegal offset type in isset or empty
-
Illegal offset type in unset
-
Cannot assign an empty string to a string offset
-
Division by zero
-
Use of undefined constant *
Исправление этих предупреждений необходимо для совместимости приложения с PHP 8.0.
Примечание. Существуют и другие фатальные ошибки в PHP 8.0, которые даже не были предупреждены в PHP 7.4. Примеры включают:
- Частные методы не могут быть объявлены окончательными, за исключением конструктора.
- Недопустимые подписи для магических методов.
- Проверка подписи метода абстрактного типажа
- Использование
parent::
с родительским классом. - Несовместимые сигнатуры перегруженных методов (принцип подстановки Лискова)
Устранение этих известных изменений — хорошее место для начала. TypeError будет постоянно выдаваться для всех внутренних функций PHP, например, при передаче недопустимых типов параметров, даже если строгая проверка типов не объявлена.
Также обратите внимание, что оператор @
больше не отключает фатальные ошибки в PHP 8.0.
Естественно, в идеале ваше приложение не должно выдавать ни ошибок, ни предупреждений, ни уведомлений. Вам предлагается обратиться к любому, что вы найдете. Некоторые предупреждения PHP в версии 8.x будут считаться фатальными ошибками в PHP 9.0, например, что может привести к неправильной логике в PHP 8.x. Наилучшей практикой является выделение времени разработки до и после выпуска для устранения таких проблем, а также тех, которые «избегают обнаружения» во время разработки. Это также инвестиции в стабильность сайта и его способность точно соответствовать критериям приемлемости для соответствующей функции.
Создавайте автоматизированные тесты
Существует множество различных типов автоматических тестов, но здесь мы имеем в виду:
- Модульные тесты — имитируют любые функции или классы, определенные WordPress, и не требуют наличия экземпляра базы данных для запуска тестов.
- Интеграционные тесты — загружает WordPress и использует реальную тестовую базу данных.
Эта тема слишком велика, чтобы ее здесь можно было подробно осветить, но есть несколько моментов, которые следует учитывать:
- Результаты зависят от полноты набора тестов. Если у вас не так много тестов, вам будет не хватать необходимого покрытия для обеспечения совместимости.
- Используйте строгие утверждения. Например, использование
assertEquals()
выполняет свободное сравнение, тогда какassertSame()
также проверяет тип. - Используйте строгое покрытие кода. Добавьте
beStrictAboutCoversAnnotations=”true”
иforceCoversAnnotations=”true”
в конфигурационный файл PHPUnit, а затем используйте аннотации@covers
, чтобы определить точный уровень международного покрытия кода тестами. - Протестируйте счастливый (поведение, основанное на ожидаемых входных данных) и неудовлетворительный (поведение, основанное на неожиданных входных данных) пути, чтобы убедиться, что функции не работают ожидаемым образом, поскольку именно здесь возникает большинство проблем, связанных со строгостью.
- Запустите свои тесты на PHP 8.0. Для тестов интеграции (WordPress) в 2021 году были внесены изменения в основной набор тестов WordPress, которые были разблокированы с использованием более поздних версий PHPUnit, которые, в свою очередь, поддерживают PHP 8.0. Это поддерживается пакетом WP Test Utils, который включает поддержку PHPUnit Polyfills, Brain Monkey и Mockery, дополнительные заглушки функций для функций WordPress и доступ ко всем собственным тестовым утилитам WP, таким как фабричные методы для создания контента.
- Рассмотрите возможность написания тестов перед попыткой исправления, чтобы быть более уверенными в том, что изменение совместимости прошло успешно.
Используйте PHPStan/Psalm или другой инструмент статического анализа
Несмотря на то, что PHPCS обнаружит некоторые несовместимости, существуют некоторые изменения во время выполнения, которые PHPCS не предназначен для обнаружения. Один пример, который будет упущен, — это нативные функции PHP, которые более строго определяют, какие типы могут быть переданы в качестве параметров.
Здесь может помочь такой инструмент, как PHPStan, Psalm или другой инструмент статического анализа. Но, чтобы быть наиболее эффективными, они требуют, чтобы ваша кодовая база либо использовала строгие типы (типы параметров и возвращаемых значений в коде), либо была правильно документирована ( @param
и @return
в DocBlocks).
Эти инструменты обычно имеют уровни правил, которые позволяют сначала исправить проблемы самого низкого уровня, а затем постепенно интегрировать инструмент для дальнейшего улучшения качества вашей кодовой базы.
Вы можете добавить информацию о типах для основного кода WordPress с помощью таких расширений, как phpstan-wordpress и psalm-plugin-wordpress.
После настройки каждый запуск будет подсвечивать, где вы передаете неожиданные типы в функции, что может привести к фатальным исключениям TypeError. Каждое из них нужно будет исправить.
Во многих случаях вы можете подавить исключение TypeError с помощью блоков try-catch или приведения типов. Однако мы настоятельно рекомендуем этого не делать. Устранение первопричины приведет к более надежному, менее хрупкому и подверженному ошибкам коду и почти всегда окупится в долгосрочной перспективе.
Как начать работу с PHP 8.0 на WordPress VIP
Запустите приложение локально
Локальный запуск экземпляра приложения — разумный первый шаг к обнаружению и устранению любых проблем совместимости. Хотя вы можете использовать любую локальную среду разработки, для обеспечения наилучшего паритета с платформой WordPress VIP мы рекомендуем локальную среду разработки VIP. Выполнив команду vip dev-env create --php=8.0
(с VIP-CLI 2.9.5 или более поздней версии), а затем выполнив оставшуюся часть мастера установки, ваше приложение будет работать локально с PHP 8.0.
Проверьте бота анализа кода VIP на запросах на вытягивание
Если вы посмотрите на любые запросы на вытягивание, отправленные в ваш репозиторий в рамках организации wpcomvip, вы увидите, что бот VIP Code Analysis Bot дает вам отзывы о PHPCS, PHP linting и SVG linting.
На этапе PHP Linting бот будет анализировать PHP-код с любой версией PHP, используемой для приложения, в котором развертывается репозиторий. Если это версия PHP 7.4, теперь она будет автоматически анализировать PHP 8.0, готовясь к предстоящему переключению.
Включите PHP 8 в ваших VIP-приложениях WordPress
После того, как вы сделали как можно больше проверок и исправлений локально, пришло время включить PHP 8.0 в вашем VIP-приложении WordPress. Начните с самой низкой среды и убедитесь, что все выглядит хорошо (включая журналы PHP через vip-cli или журналы работоспособности на VIP-панели), прежде чем переходить к рабочей среде.
Чтобы включить PHP 8.0 в среде, откройте тикет Zendesk, сообщив нам, в каком приложении и среде вы хотите его включить.
Вскоре мы выпустим новую функцию на VIP-панели, позволяющую изменять версию PHP без необходимости открывать тикет. Всегда проверяйте лобби на наличие последней информации.
Воспользуйтесь проактивной помощью
Группы по работе с клиентами для клиентов Premier уже связываются с клиентами, чтобы обсудить, как мы можем им помочь. Им будут отправлены результаты от PHPCS и предоставлены инструкции о том, как выполнить эти проверки самостоятельно. Предупреждения PHP, которые станут фатальными ошибками, также будут выделены, что даст им преимущество в устранении несовместимостей.
А как насчет PHP 8.1?
Платформа WordPress VIP также поддерживает PHP 8.1. Между PHP 8.0 и PHP 8.1 меньше изменений, чем между PHP 7.4 и 8.0, а это значит, что несовместимостей должно быть меньше.
PHP 8.1:
- Имеет активную поддержку разработчиков ядра PHP до ноября 2023 года и поддержку безопасности до ноября 2024 года.
- Может обрабатывать больше запросов в секунду, чем PHP 8.0.
- Имеет поддержку «бета-совместимости» в WordPress 5.9 и выше — это означает, что при подготовке к PHP 9 есть некоторые уведомления об устаревании, но это не влияет на поведение ядра WordPress.
Полезные изменения, необходимые для PHP 8.0, такие как использование строго типизированного кода и добавление автоматических тестов, помогут при развертывании PHP 8.1, а также обновлениях для WordPress 6.1, 6.2, 6.3 и выше, а также любых выпусках функций, которые вы делаете. Процесс обеспечения качества часто является узким местом, поэтому использование некоторых из описанных нами инструментов и подходов может сократить объем ручного труда и повысить уверенность при развертывании этих изменений.
Если у клиентов есть вопросы о PHP 8.0, отправьте нам заявку.