Вчера вечером вышел 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
1Bugo27-11-2020 12:24
Приятные новости, спасибо.
2АлександрСайт03-12-2020 22:31
Радует, что движок поддерживается и , как говорится идет в ногу со временем. Удивляет "слепота" web-разработчиков не позволяющая им рассмотреть и использовать преимущества данного движка.
3Роман20-12-2020 08:07
Недавно слушал размышления одного аутсорсера — ему понадобилось сделать сайт-визитку, так он решил, что лучше использовать Shop-Script — только лишь потому что ему с ним привычнее. Такие и землю копать будут граблями, если именно так им привычнее :)