Как релиз PHP 8.0 повлияет на WordPress и стоит ли сразу обновиться?

На 26 ноября 2020 года запланирован выпуск релиза PHP 8.0. Самая актуальная версия языка программирования PHP, на котором работают сайты WordPress, предлагает новые функции, которые разработчики сочтут полезными, а также улучшения, которые обещают значительно повысить безопасность и производительность в долгосрочной перспективе. Он также полностью удаляет ряд ранее устаревших функций. PHP 8 сильно отличается от предыдущих версий.

Стоит ли сразу обновиться?

Конечно нет. Согласно информации разработчиков WordPress, предстоящая основная версия WordPress 5.6 должна быть «бета-совместимой с PHP 8». Это означает, что большинство основных функций WordPress будут работать, но в течение некоторого времени могут возникать непредвиденные ошибки, даже без наличия дополнительных плагинов или тем. WordPress призвал к дополнительному тестированию PHP 8, чтобы найти и исправить как можно больше оставшихся ошибок.

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

Какие критические изменения?

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

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

Некоторые функции и возможности, которые были объявлены устаревшими в PHP 7.x, были полностью удалены. Они включают:

  • $php_errormsg variable
  • create_function() function
  • mbstring.func_overload ini directive
  • real type
  • allow_url_include ini directive
  • restore_include_path() function
  • each() function

Хотя большинство из них больше не используются широко, известно, что create_function по-прежнему используется в более чем 5 500 плагинах WordPress, включая чрезвычайно популярные плагины с миллионами установок. В некоторых случаях использование этих устаревших функций может быть предназначено для обратной совместимости со старыми версиями PHP. Однако многие плагины потребуют обширного рефакторинга по мере того, как PHP 8 станет более популярным.

Многие плагины и темы также сильно зависят от сторонних библиотек. Разработчикам WordPress, возможно, придется подождать, пока они не будут обновлены для совместимости. Если эти библиотеки не поддерживаются или не обновляются для совместимости с PHP 8, может потребоваться разветвить эти библиотеки, найти альтернативы или даже переписать плагины и темы с нуля.

Какие существуют проблемы безопасности?

PHP позволяет так называемое «жонглирование типами». Это означает, что он может обрабатывать строки, содержащие числа, так же, как и целые числа или числа с плавающей точкой, и может выполнять математические вычисления и сравнения между этими разными типами, если вместо оператора строгого сравнения === используется свободный оператор сравнения ==. Для разработчиков «жонглирование типами» может быть очень полезным и сэкономить время при написании кода, но иногда может привести к необычному поведению.

Классическим примером того, как жонглирование типами может вызывать проблемы, является то, что сравнение 0 == ”blah” вернет true. PHP 8 исправляет этот тип поведения, поэтому эти и подобные сравнения (например, 0 == ”0blah”) возвращают false.

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

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

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

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

Какие предполагаются изменения производительности?

Одна потенциально захватывающая функция, которая появится в PHP 8, — это JIT или or “Just In Time” компиляция «точно в срок». PHP — это интерпретируемый язык, что означает, что он переводится в машинный код во время работы. JIT отслеживает часто используемый код и пытается оптимизировать трансляцию машинного кода, чтобы его можно было использовать повторно. Это может привести к значительному повышению производительности определенных функций.

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

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

Как долго разработчики должны обновляться?

Каждая версия PHP имеет жизненный цикл в 2 года, в течение которого исправляются ошибки, и дополнительный год, в течение которого устраняются проблемы безопасности. PHP 7.4 вышел в ноябре 2019 года. В качестве последней версии PHP 7 это означает, что ошибки в PHP 7.4 будут исправлены до ноября 2021 года, а проблемы безопасности будут исправлены до ноября 2022 года, после чего он достигнет финала — «End of Life». Это означает, что ноябрь 2022 года можно считать жесткой датой отсечения: весь PHP-код должен быть совместим как минимум с PHP 8.0 к этому времени, иначе возникнет риск «застрять» на потенциально уязвимой версии PHP.

Рекомендации

Если вы разработчик, начните тестирование своего кода и любых зависимостей на PHP 8, если вы еще этого не сделали. Составьте план по разветвлению или замене любых библиотек, которые не обновляются.

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

Вывод

Экосистема WordPress и в прошлом претерпевала сложные изменения, а сообщество разработчиков ПО с открытым исходным кодом всегда развивалось и адаптировалось. С уверенностью можно сказать, что переход на PHP 8 — одно из самых масштабных и значительных изменений, которые когда-либо видел язык PHP, но в долгосрочной перспективе это того стоит. В то же время владельцы и разработчики сайтов WordPress в краткосрочной перспективе могут столкнуться с определенными трудностями.