YiiFramework Новости Yii 2020, выпуск 7

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Нас тут интересует "Test Suite 3: Instantiating a large number of small object graphs, Singleton scope" потому как это наиболее частый кейс в реальных приложениях. И что мы там видим? 5.6ms на 1000 небольших графов (не отдельных объектов) у Yii 2, 4.4ms у Symfony. Это всё на PHP 8 с включенным OpCache, preloading и всем-всем. Выиграли мы на компиляции контейнра в очень жирном монолите 1.2ms на запрос. В % была бы норм разница если бы не абсолютное значение... Чтобы это ощутить нужно чтобы твой монолит с 4000 сервисов был написан прям совсем идеально с точки зрения производительности и раздеплоен в идеальную среду выполнения. Мы всё-таки сейчас про мысленный эксперимент или про проблемы в твоём идеальном проекте?
1. instantiate 1000 different objects - это противоположное по смыслу выражение к фразе "не отдельных объектов", но я понимаю, что ты имеешь ввиду 1000 объектов, создаваемых по цепочке зависимостей для вызываемых сервисов

2. Не согласен, в реальных приложениях не создается 100 сервисов с 1000 зависимостей на вызов, это ты взял случай долгоживущего тяжелого cli worker. На отдельный http-запрос сервисов создается штук 30 (роутинг, контроллер, auth, модель, драйвер базы, шаблонизатор, кеш, инфраструктура), и зависимостей у каждого не 1000, а до 50. К реальному случаю для web ближе 1й и 2й тесты, а в них разница уже в 5 раз, как и в 4м тесте

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

fixxxer

К.О.
Партнер клуба
Laravel кушают рынок complimentary product-ов Symfony, при этом у Symfony хуже позиция, они тратят силы на основные либы, а Laravel нет.
Ну это даже примерно не так, в ларавеле от симфони полторы библиотеки, да и те обернуты в свои врапперы.
 

Sam Dark

Новичок
Ну это даже примерно не так, в ларавеле от симфони полторы библиотеки, да и те обернуты в свои врапперы.
Разве? Вроде весь foundation... и ещё сверху: https://github.com/laravel/framework/blob/8.x/composer.json#L34

3. в компенсацию за компиляцию идет такая фича, как autoconfigure - когда класс приложения можно использовать как сервис сразу, не раздувая конфиги контейнера
У нас эта фича есть из коробки в двух варианциях: умолчания и попытка инстанциирования "как есть". Компиляция тут не нужна.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Разве? Вроде весь foundation... и ещё сверху: https://github.com/laravel/framework/blob/8.x/composer.json#L34
foundation, кстати - причина тормозов, его как-раз использовать необязательно, в этом смысл сборки из конструктора

У нас эта фича есть из коробки в двух варианциях: умолчания и попытка инстанциирования "как есть". Компиляция тут не нужна.
я все-равно не хочу переходить к флейму со сравнением symfony с yii 2, они слишком разные, я работаю с обоими,
если хочешь, могу рассказать что нужно в работе
например, инъекция в параметр сервиса константы, которая объявлена в объекте другого сервиса или классе, не вызовом в конфиге, а при создании сервиса, чтобы не подгружать ненужные классы и не создавать сервисы при каждом запросе

а вместо Yii::$container->invoke([$obj, 'doSomething'], 'param1' => 42]) лучше добавить тип инъекции invoker, и писать container::makeInvoker($obj)->doSomething(param1: 42)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Это как-раз касается конфига в виде массива - если прописать передачу в параметр константу из другого сервиса, этот второй сервис будет создаваться при загрузке конфига, или будет ошибка.

В конфиге нужно как-то указать, что в сервис при создании надо передать в параметр значение, которое надо взять из константы объекта другого сервиса.
Или хотя бы из константы класса, только без загрузки класса при загрузке конфига, хотя, хандкодить имя класса хуже.
Хотя бы короткие функции, хотя есть опасение, что конфиг станет простыней со спагетти.

В симфони можно извернуться с service() - грубо, ну или через конфигуратор. Нужен механизм.

при разрезании монолита и рефакторинге чужого кода такая фигня с расцеплением обращений к константам других классов через инъекцию значения в мешок параметров нужна постоянно
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
не ну, error-handler и finder - обертки, а зачем kernel - не представляю;
может, у них декларации интерфейсов и константы общие?
routing в ларавеле как-бы тоже свой, непонятно
 
Сверху