2012-06-03 3 views
4

Приложение My Symfony2 имеет некоторые проблемы с производительностью, поэтому я запустил webgrind на нем, чтобы увидеть, что происходит. Оказывается, он обрабатывал огромное количество файлов YML по каждому запросу, и я не могу понять, почему. У меня уже включено кэширование APC, поэтому я не знаю, что это может быть. Любая помощь в этом вопросе будет высоко оценена.Приложения для приложений Symfony2 YML по каждому запросу

Редактировать: Вот скриншот webgrind, в котором я бежал. http://i.imgur.com/m7g6l.jpg

+1

Удалить файлы YML, поэтому они не могут быть загружены (или какой-то совет вы ожидаете без на самом деле не давая конкретной информации?). – hakre

+0

Какую конкретную информацию я могу дать? Вся информация, которую дал мне webgrind, заключалась в том, что функции разбора YML вызывались по каждому запросу, я точно не знаю, какие файлы обрабатываются. – user1045879

+1

Вы работаете в режиме производства или разработки? В режиме производства результаты синтаксического анализа YML кэшируются. – Cerad

ответ

1

Выяснено, что происходит. Я использовал APC и работал, но не использовал ApcUniversalClassLoader в моем autoload.php. Подробнее here. Когда они говорят в «рекомендациях» документов для повышения производительности, они действительно означают «вы должны это сделать, или ваша производительность будет ужасной».

+0

Я очень удивлен тем, что включение APC имело такой эффект. Поскольку @Cerad упоминал, что файлы YAML должны кэшироваться в методе производства, независимо от кэширования загрузчика вашего класса. Я запустил Symfony 2 без кэша загрузчика классов с большой производительностью (например, с помощью PHP opcache без apcu). – Ryan

+0

Райан - вы бежите 2,5+? Я запускаю 2.3, и после прохождения кода я обнаружил, что Doctrine использует кеш-память по умолчанию, которая заканчивается с каждой загрузкой/экземпляром страницы. В 2.3 метаданные Doctrine (т. Е. Файлы orm YAML) анализируются на каждую загрузку страницы, если вы не измените этот метод кеширования на APC, memcached или другие параметры. Возможно, 2.5 изменяет этот поведенческий подход. В любом случае, я сомневаюсь, что изменения APC, упомянутые выше, также повлияли на YAML. Из того, что я вижу (и из документации), Doctrine не будет использовать APC, если вы специально не настроили его. –

+0

От взгляда на документацию 2.5 также требуется настройка драйвера кэша Doctrine, поэтому, возможно, вы уже настроили эту настройку. Мне любопытно, если вы работаете с настройками по умолчанию для части ORM в app/config/config.yml или, если он, фактически, настроен на использование надлежащего кеша. –

2

Из моих исследований выяснилось, что APCClassLoader не заставляет Symfony2 кэшировать файлы YAML, используемые в Doctrine. Кажется, что кеширование файлов конфигурации по умолчанию (config.yml, parameters.yml), но фактические файлы ORM YAML, используемые Doctrine, не кэшируются, если вы не указали драйвер кэша, как показано в документации, приведенной ниже:

http://symfony.com/doc/2.3/reference/configuration/doctrine.html#caching-drivers

Итак, возможно, что решение выше решило проблему, если на плакате была только конфигурация YAML, а не доктрина YAML. Однако, если задействована Doctrine YAML, необходимо указать драйвер кэша Doctrine.

Это также влияет на людей, использующих аннотации, поскольку они будут анализироваться при каждой загрузке страницы, если не указан драйвер кэша (кроме кэша массива по умолчанию Doctrine).

Думаю, что я должен опубликовать сообщение, потому что это сложная проблема, и приведенный выше ответ вводит в заблуждение в моем случае, когда файлы Doctrine ORM YAML были источником проблемы кэширования.

Это сообщение имеет более подробную информацию о моей конкретной проблеме и разрешение:

Why is Symfony2 app spending 70-90% of its time parsing YAML?

+0

Эй, @Nate Stone, вы знаете, работает ли этот кэш доктрин с формами * yaml * файлов? –

+0

Документы, по-видимому, указывают, что проверка использует APC по умолчанию в соответствии с этой ссылкой: http://symfony.com/doc/current/components/validator/resources.html#caching Существует связанная с этим проблема/проблема, где они обсуждаются настройка вашего собственного сервиса: https://github.com/symfony/symfony/pull/12975 –

Смежные вопросы