• Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Ну в итоге получился вот такой кусок кода

    $classMetadataFactory = new CacheClassMetadataFactory(
                new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())),
                new ApcuAdapter('SymfonyMetadata')
            );
            $propertyAccessor = PropertyAccess::createPropertyAccessorBuilder()
                ->setCacheItemPool(new ApcuAdapter('SymfonyPropertyAccessor'))
                ->getPropertyAccessor();
    
    
            $reflectionExtractor = new ReflectionExtractor();
            $phpDocExtractor = new PhpDocExtractor();
            $propertyTypeExtractor = new PropertyInfoExtractor(
                [$reflectionExtractor],
                [$phpDocExtractor, $reflectionExtractor],
                [$phpDocExtractor],
                [$reflectionExtractor],
                [$reflectionExtractor]
            );
            
            $propertyTypeExtractor = new PropertyInfoCacheExtractor($propertyTypeExtractor, new ApcuAdapter('SymfonyPropertyAccessor'));
            
            $normalizer = new ObjectNormalizer(
                $classMetadataFactory,
                null,
                $propertyAccessor,
                $propertyTypeExtractor
            );
            $arrayNormalizer = new ArrayDenormalizer();
            $serializer = new Serializer([$arrayNormalizer, $normalizer]);
    
            return $serializer->denormalize($array, $className);


    Предполагаю, что я что - то не так сделал, но стало еще медленнее работать 12 секунд.
    Ради эксперимента я сократил JSON до 1 значения скрипт отработал за 2 секунды вместо 12.
    Значит вложенность очень сильно влияет.
    Дальше попробую свой Нормалайзер запилить, может это как - то сократит расходы, т.к. не будет итераций по большой вложенности и попробую в итоге jms/serializer может аннотации доктрины будут как - то быстрее.

    Надеюсь, что кому - то эта ветка будет полезна.
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Тормоза дает $phpDocExtractor
    Ниже выделю его жирным

    $propertyTypeExtractor = new PropertyInfoExtractor(
    [$reflectionExtractor],
    [$phpDocExtractor, $reflectionExtractor],
    [$phpDocExtractor],
    [$reflectionExtractor],
    [$reflectionExtractor]
    );

    Если его убрать, то конечно все перестает работать, но и тормоза исчезают.
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Как у меня все устроено.

    Есть огромный JSON, который не из бд идет.
    Сейчас я просто уже готовый json подсовываю в десериалайзер
    Ниже вчерашний код.
    $array = уже готовый массив с данными.
    className = название класса
    
         $reflectionExtractor = new ReflectionExtractor();
            $phpDocExtractor = new PhpDocExtractor();
            $propertyTypeExtractor = new PropertyInfoExtractor(
                [$reflectionExtractor],
                [$phpDocExtractor, $reflectionExtractor],
                [$phpDocExtractor],
                [$reflectionExtractor],
                [$reflectionExtractor]
            );
    
            $normalizer = new ObjectNormalizer(
                null,
                null,
                null,
                $propertyTypeExtractor
            );
            $arrayNormalizer = new ArrayDenormalizer();
            $serializer = new Serializer([$arrayNormalizer, $normalizer]);
    
            return $serializer->denormalize($array, $className);


    я вот этот вот кусок кода просто замерил через microtime(true) и получил на выходе 8 секунд.

    Если вернуть вот так
    $normalizer = new ObjectNormalizer(
                null,
                null,
                null,
                new ReflectionExtractor()
            );
            $arrayNormalizer = new ArrayDenormalizer();
            $serializer = new Serializer([$arrayNormalizer, $normalizer]);
    
            return $serializer->denormalize($array, $className);

    то выполнение меньше секунды, но тогда не работает то, с чего началась эта ветка.

    Т.е. тормоза происходят вот тут

    $reflectionExtractor = new ReflectionExtractor();
            $phpDocExtractor = new PhpDocExtractor();
            $propertyTypeExtractor = new PropertyInfoExtractor(
                [$reflectionExtractor],
                [$phpDocExtractor, $reflectionExtractor],
                [$phpDocExtractor],
                [$reflectionExtractor],
                [$reflectionExtractor]
            );


    Глубже я еще не уходил в проблему. Пишу сразу то, до чего дошел.
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Про производительность, похоже, очень актуально.
    Запустил у себя все на реальных примерах и обрабатывает по 8 секунд.
    В реальной жизни вложенность классов на много больше + данных тоже очень много.
    Получается что пока компонент пробежит все вложенности, проходит очень много времени.
    Нашел вот такое в мануале

    Ссылка на мануал

    Performance¶
    To figure which normalizer (or denormalizer) must be used to handle an object, the Serializer class will call the supportsNormalization() (or supportsDenormalization()) of all registered normalizers (or denormalizers) in a loop.
    
    The result of these methods can vary depending on the object to serialize, the format and the context. That's why the result is not cached by default and can result in a significant performance bottleneck.
    
    However, most normalizers (and denormalizers) always return the same result when the object's type and the format are the same, so the result can be cached. To do so, make those normalizers (and denormalizers) implement the CacheableSupportsMethodInterface and return true when hasCacheableSupportsMethod() is called.

    Типа все может кешироваться и из коробки оно уже есть. Но как оно будет кешить, если нигде и ничего не указано о том куда кешировать?

    Так вот вопрос - Как заставить это все кешировать? 8 секунд - это катастрофически много.
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Отлично, получилось, спасибо.
    Тогда еще вопрос - а что лучше использовать пакет симфони или
    https://packagist.org/packages/jms/serializer ?
    В jsm используется доктрина и в ней , вероятно, есть свои плюсы?
    Я с ней еще не работал и не могу как - то однозначно решить для себя, что лучше.
    Есть ли разница в производительности?
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    проставил массивы и ошибки ушли, но все равно сеттером пишется массив

    [
            [
              "id" => 6082892,
              "type" => "mob",
              "number" => "+79818"
            ],
            [
              "id" => 60828927,
              "type" => "mob",
              "number" => "+7988"
             ]
          ],
  • Symfony serializer как десериализовать массив с объектами?

    @dinya17 Автор вопроса
    Не помогает, появилась ошибка.
    The type of the "phones" attribute for class "dto\ContragentDto" must be one of "entities\Phone[]" ("array" given).

    Может я что - то не так указал в аннотациях?
  • При повышении нагрузки на nuxtjs получаю ошибку FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory?

    @dinya17 Автор вопроса
    Никита Полевой, --max_old_space_size сделал, не помогло.

    node --max-old-space-size=8192 node_modules/nuxt/bin/nuxt.js start
  • Хочу попробовать асинхронность PHP 7 с помощью REACTPHP, нужен совет?

    @dinya17 Автор вопроса
    Спасибо за пояснение, сейчас я понял свою ошибку в рассуждениях
  • Плагин на VueJs для сайта, переопределяется css класс, как быть?

    @dinya17 Автор вопроса
    Сергей delphinpro, спасибо за совет. Решилось все прописыванием стилей в компонентах. initial тоже помог.
  • Как в Yii2 сделать логирование в файлы и их архивирование?

    @dinya17 Автор вопроса
    да/. сейчас у меня все логируется как надо, вот именно архивирование инетесует. Есть старая библиотека log4php вот она умеет архивировать из коробки. Может стоит в ней поковырять. Но крон выглядит сейчас самым логичным решением.
  • Как в Yii2 сделать логирование в файлы и их архивирование?

    @dinya17 Автор вопроса
    DarkByte2015, ну такие мысли есть, конечно. Меня больше интересуют готовые решения, зачем свой велосипед, если есть что - то работающее. Но ничего подобного я пока не нашел
  • Vuetify JS, Nuxt Как кастомизировать компоненты под свой дизайн?

    @dinya17 Автор вопроса
    Ну как вариант , да. А если обновился компонент? Необходимо и свой css каждый раз править?
    Т.е. я по идее могу свой css завести и в нем переопределить нужные мне стили?