Современная, быстрая и удобная система управления сайтом

PHP 8, JIT и MaxSite CMS

БлогКомментарии: 3Просмотров: 6099

Вчера вечером вышел PHP 8.0 и я сделал обновление MaxSite CMS для поддержки этой версии. Основные переделки были в аргументах функций (часть из CodeIgniter). Раньше аргументы, которые имели значения по умолчанию, могли располагаться произвольно. Теперь — только после обязательных.

Вот пример:

// PHP 7
function my($a, $b = '', $c) {}

В PHP 8 это вызовет ошибку, поскольку аргумент $b теперь должен находиться после $c. Но менять порядок аргументов функции нельзя (это сломает все её использования), то единственным вариантом будет прописать значение по умолчанию для $c.

// PHP 8
function my($a, $b = '', $c = '') {}

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

Возникла забавная ошибка в обычном комментарии:

#[15] ...

Теперь это не комментарий, а аннотации к функции. Пока неясно как этим пользоваться, но наверное кому-то нужно.

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

Впрочем — все эти изменения — мелочь по сравнению с тем, что разработчики PHP полностью удалили функцию create_function(). Она хороша тем, что позволяла создавать функции динамически. У нас она используется в mso_hook_add_dinamic(), чтобы динамически создать функцию и сразу её добавить к хуку. То есть не нужно создавать отдельную функцию (очень небольшую), а потом её привязывать к хуку.

Вместо create_function() предлагается использовать анонимные функции, но у них есть проблема — нет имени, а создать такую функцию глобально невозможно. Чтобы привязаться к хуку нужно указать имя функции (только имя — строка), что и делала create_function()...

Чтобы не переделывать mso_hook_add_dinamic() и ещё десятки файлов, где она используется, я изменил алгоритм: пошёл на хитрость. Поскольку здесь передаётся php-код, то перед ним добавляется «метка» (/**msofunc**/ — обычный php-комментарий). А функция хука (mso_hook) уже сама смотрит — если есть «метка», то делает анонимную функцию и выполняет её через eval(). То есть в целом получилась та же create_function(), только в локальной области видимости.

После переделок я смог протестировать скорость работы MaxSite CMS на PHP 8. В целом скажу, что никакого роста скорости или уменьшения потребления памяти по сути нет — всё в пределах погрешности (среднее от 10 измерений).

Вывод главной странице на всех версиях 7.3, 7.4 и 8.0 занял 0.12 секунды. Одиночная страница примерно 0.20 секунды.

Потребление памяти улучшилось: 7.3 = 4.36MB, 7.4 = 4.23MB, 8.0 = 4.21MB для главной. Это немного, но рост есть.

Но больше всего меня интересовала JIT-компиляция, которая в PHP 8 преподносится, как самая главная «фишка». Чтобы её включить нужно в php.ini добавить директивы:

zend_extension=opcache
 
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=100M
opcache.jit=function

Проверить, что JIT работает можно так:

print_r(opcache_get_status()['jit']);

Параметр opcache.jit у меня заработал только со значением function. Есть ещё и другие (tracing), но у меня они почему-то «не завелись».

Результат меня порадовал. Главная — 0.05 секунд, одиночная запись — 0.09 секунд. То есть прирост скорости примерно в 2,5 раза. Память при этом уменьшилась до 1.13MB — почти в 4 раза.

Это очень неплохо с учётом того, что этот результат получается без переделки исходного php-кода. Хотя, конечно, пока рано говорить о возможных проблемах, поскольку тестирования по сути не было, может ещё какие-то «косяки» всплывут, но в целом тенденция хорошая. В любом случае MaxSite CMS поддерживает PHP 8 из «коробки» уже сегодня начиная с версии 107.3.

Комментариев: 3 RSS

2АлександрСайт03-12-2020 22:31

Радует, что движок поддерживается и , как говорится идет в ногу со временем. Удивляет "слепота" web-разработчиков не позволяющая им рассмотреть и использовать преимущества данного движка.

3Роман20-12-2020 08:07

Недавно слушал размышления одного аутсорсера — ему понадобилось сделать сайт-визитку, так он решил, что лучше использовать Shop-Script — только лишь потому что ему с ним привычнее. Такие и землю копать будут граблями, если именно так им привычнее :)

Оставьте свой комментарий!

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)