Как отключить профилировщик в Symfony2 в производстве?

Как отключить профилировщик в Symfony2 в производстве?

Я не имею в виду панель инструментов - я имею в виду профилировщик.

Я хочу отключить его в производстве, я широко использую его для разработки, поэтому решение с удалением его пакета не работает.

Я попытался установить framework.profiler.only_exceptions значение true. Я попытался удалить в целом. Независимо от того, что профилировщик.db растет после каждый запрос и каждый ответ содержит x-debug-token заголовок.

Я дважды проверил файлы конфигурации (config.YML И же config_prod.yml), и все, кажется, оштрафовано.

что больше команды app/console router:dump-apache --no-debug всегда выводит _wdt и _profiler маршруты, но у меня их нет в моем routing_prod.yml, и они, похоже, не присутствуют при попытке получить к ним доступ из браузера (404).

я запускаю symfony 2.0, и я не буду обновляться прямо сейчас из-за некоторых серьезных изменений в 2.1 что потребует переписывания многих элементов. Было бы неразумно начинать его непосредственно перед началом развертывания.

3 ответов


Symfony >= 2.2

начиная с Symfony 2.2 профилировщик поддерживает enabled флаг в конфигурации фреймворка и по умолчанию отключен в test окружающая среда.

# app/config/config_test.yml
framework:
    profiler:
        enabled: false

посмотреть этот запись в блоге о профилировании компанией Fabien Potencier и ссылка на конфигурацию FrameworkBundle для получения более подробной информации.

Update: этот флаг по-прежнему действителен в в Symfony 4.0.


Symfony

в Symfony framework.profilerключ в конфигурации.

вы можете увидеть это в ProfilerPass конфигурации Symfony2 FrameworkBundle.

это относится к умолчанию config.yml и config_prod.yml (включая бывших). Поэтому, если вы не возились с конфигурациями по умолчанию, вы штраф.

на значение по умолчанию:

framework:
    profiler: { only_exceptions: false }

который включает профилирование для dev окружающая среда и все среды, которые импортируют config_dev.yml как config_test.yml.

если вы хотите снять значение профилировщика в последующей конфигурации, используйте:

framework:
    profiler: false

значения {} или ~ не установлено значение. Вы должны использовать false.


вы пробовали это (включить только для разработки)

поскольку профилировщик добавляет некоторые накладные расходы, вы можете включить его только при определенных обстоятельствах в производственной среде. Этот только-параметры исключений ограничивают профилирование до 500 страниц, но что, если вы хотите получить информацию, когда IP-адрес клиента поступает из определенного адрес или ограниченная часть веб-сайта? Вы можете использовать запрос matcher:

framework:
    profiler:
        matcher: { ip: 192.168.0.0/24 }

http://symfony.com/doc/current/book/internals.html#profiler

или

профилировщик можно отключить на основе каждого действия, выполнив что-то вроде:

if(in_array($this->container->get('kernel')->getEnvironment(), array('prod'))) {
    $this->container->get('profiler')->disable();
}

я понял это, но все же я не уверен, почему настройки профилировщика не работали. Я очистил кэш с помощью --no-debug после каждого изменения конфигурации.

сначала я осмотрел конфигурация FrameworkBundle и узнал, что узел profiler conf имеет canBeDisabled(). Затем я проверил, что это значит ровно.

оказывается, что каждый canBeDisabled узел имеет подразумеваемый дочерний узел enabled со значением по умолчанию true. Вы можно либо переопределить его, либо установить родительский узел непосредственно в false или null отключить разделе. Если вы просто опустите раздел профилировщика, он будет включен по умолчанию.

может быть, я пропустил это в документации, но я уверен, что это должно быть упомянуто здесь. Кроме того, на мой взгляд, profiler должен быть отключен по умолчанию в производстве. Я не могу представить себе сценарий, когда было бы полезно запустить profiler в производстве в долгосрочной перспективе. Я буду счастлив, если кто-то докажет я ошибаюсь.

кстати, я заметил тогда как profiler.db растет, тогда каждый запрос становится медленнее, но это может быть не так в prod.