PHP 8, как ожидается, будет выпущен в декабре 2020 года и принесет нам целый ряд мощных функций и значительных улучшений языка.
Многие RFC уже были одобрены и внедрены, поэтому нам пора погрузиться в некоторые из самых интересных дополнений, которые должны сделать PHP быстрее и надежнее.
Поскольку PHP 8 все еще находится в стадии разработки, мы могли увидеть несколько изменений до финальной версии.
Итак, какие функции и улучшения следует ожидать с PHP 8? Что самое большое в PHP 8, следующей основной версии языка?
Самая известная особенность PHP 8 – это компилятор Just-in-time (JIT) . Что такое JIT?
Предложение RFC описывает JIT следующим образом:
«PHP JIT реализован как почти независимая часть OPcache. Это может быть включено/отключено во время компиляции PHP и во время выполнения. Когда этот код включен, нативный код файлов PHP хранится в дополнительной области общей памяти OPcache, а обработчики op_array → opcodes []. Обработчики сохраняют указатели на точки входа в код JIT».
Итак, как мы попали в JIT и в чем разница между JIT и OPcache?
Чтобы лучше понять, что такое JIT для PHP, давайте кратко рассмотрим, как PHP выполняется из исходного кода до конечного результата.
Выполнение PHP – это 4 этапа:
На следующем рисунке показано визуальное представление основного процесса выполнения PHP.
Итак, как OPcache делает PHP быстрее? А что меняется в процессе исполнения с JIT?
PHP – это интерпретируемый язык. Это означает, что при запуске сценария PHP интерпретатор анализирует, компилирует и выполняет код снова и снова при каждом запросе. Это может привести к потере ресурсов процессора и дополнительного времени.
Вот где расширение OPcache вступает в игру:
«OPcache повышает производительность PHP, сохраняя байт-код предварительно скомпилированного скрипта в общей памяти, тем самым устраняя необходимость в PHP загружать и анализировать скрипты при каждом запросе».
При включенном OPcache интерпретатор PHP проходит 4-этапный процесс, упомянутый выше, только при первом запуске сценария. Поскольку байт-коды PHP хранятся в общей памяти, они сразу же доступны как низкоуровневое промежуточное представление и могут быть сразу выполнены на виртуальной машине Zend.
Начиная с PHP 5.5 расширение Zend OPcache доступно по умолчанию, и вы можете проверить правильность его настройки, просто вызвав скрипт phpinfo() на своем сервере или проверив файл php.ini.
OPcache был недавно улучшен за счет реализации предварительной загрузки , новая функция OPcache добавлена в PHP 7.4. Предварительная загрузка обеспечивает способ сохранения указанного набора сценариев в памяти OPcache «до запуска любого кода приложения», но это не приносит ощутимого улучшения производительности для типичных веб-приложений.
С JIT PHP делает шаг вперед.
Даже если коды операций имеют форму низкоуровневого промежуточного представления, они все равно должны быть скомпилированы в машинный код. JIT «не вводит никакой дополнительной формы IR (промежуточное представление)», но использует DynASM (Dynamic Assembler для механизмов генерации кода) для генерации нативного кода непосредственно из байт-кода PHP.
Короче говоря, JIT переводит горячие части промежуточного кода в машинный код. Обойдя компиляцию, она сможет значительно улучшить производительность и использование памяти.
Но сможет ли JIT эффективно улучшить производительность WordPress?
Согласно JIT RFC, своевременная реализация компилятора должна улучшить производительность PHP. Но действительно ли мы испытали бы такие улучшения в реальных приложениях, таких как WordPress?
Ранние тесты показали, что JIT заставил бы загруженные с высокой нагрузкой процессоры работать значительно быстрее, однако RFC предупреждает:
«… Как и предыдущие попытки – в настоящее время он, похоже, не значительно улучшает реальные приложения, такие как WordPress (с opcache.jit = 1235 326 запросов/сек против 315 запросов/сек).
Планируется приложить дополнительные усилия, улучшая JIT для реальных приложений, используя профилирование и умозрительную оптимизацию».
Если JIT включен, код будет выполняться не виртуальной машиной Zend, а самим процессором, что повысит скорость вычислений. Веб-приложения, такие как WordPress, также зависят от других факторов, таких как TTFB, оптимизация базы данных, HTTP-запросы и т. д.
Поэтому, когда речь заходит о WordPress и аналогичных приложениях, не стоит ожидать значительного увеличения скорости выполнения PHP. Тем не менее, JIT может принести ряд преимуществ для разработчиков.
По словам Никиты Попова:
«Преимущества JIT-компилятора приблизительно (и как уже было указано в RFC):
- Значительно лучшая производительность для числового кода.
- Немного лучшая производительность для «типичного» кода PHP веб-приложения.
- Потенциал для переноса большего количества кода с C на PHP, потому что PHP теперь будет достаточно быстрым».
Итак, хотя JIT вряд ли принесет значительные улучшения производительности WordPress, он будет обновлять PHP до следующего уровня, делая его языком, на котором многие функции теперь могут быть написаны непосредственно.
Недостатком, однако, будет большая сложность, которая может привести к увеличению затрат на обслуживание, стабильность и отладку.
По словам Дмитрия Стогова:
«JIT чрезвычайно прост, но в любом случае увеличивает уровень сложности PHP, риск появления новых ошибок и стоимость разработки и обслуживания».
Предложение включить JIT в PHP 8 было принято 50 голосами против 2.
Продолжение: