Symfony 4: скрыть трассировку стека отладки в непроизводственной среде - PullRequest
0 голосов
/ 18 января 2019

У меня есть 2 производственные среды: prod1 и prod2 , они отличаются по конфигурации, как база данных и бизнес-логика. Это в основном отношения хозяин-раб.

Я хочу скрыть трассировку стека отладки от пользователя, как в обычных производственных средах. Это должно быть возможно путем установки APP_DEBUG = 0 в .env файле.

APP_DEBUG=0

Но я получаю экран отладки:

enter image description here

Но, как ни странно, это не работает, только если для APP_ENV установлено значение prod , трассировки стеков отладки не отображаются.

Мой файл .env выглядит так:

APP_ENV=prod1
APP_DEBUG=0
APP_SECRET=xxxxxxxaxaxaxa

Я проверил параметры в public / index.php , и они правильно перенесены:

$env = 'prod1';
$debug = false;
$kernel = new Kernel($env, $debug);

Я использую Symfony 4.2.2 с symfony / env.

Кто-нибудь может воспроизвести это поведение? Это может быть ошибка Symfony или Symfony / env?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

У меня есть несколько проектов, написанных на Symfony 4. Чтобы воспроизвести вашу ошибку, я обновил один из моих проектов до Symfony 4.2.2. Все зависимости Symfony:

symfony/browser-kit                              v4.2.2             Symfony BrowserKit Component
symfony/cache                                    v4.2.2             Symfony Cache component with PSR-6, PSR-16, and tags
symfony/class-loader                             v3.4.21            Symfony ClassLoader Component
symfony/config                                   v4.2.2             Symfony Config Component
symfony/console                                  v4.2.2             Symfony Console Component
symfony/contracts                                v1.0.2             A set of abstractions extracted out of the Symfony components
symfony/css-selector                             v4.2.2             Symfony CssSelector Component
symfony/debug                                    v4.2.2             Symfony Debug Component
symfony/dependency-injection                     v4.2.2             Symfony DependencyInjection Component
symfony/doctrine-bridge                          v4.2.2             Symfony Doctrine Bridge
symfony/dom-crawler                              v4.2.2             Symfony DomCrawler Component
symfony/dotenv                                   v4.2.2             Registers environment variables from a .env file
symfony/event-dispatcher                         v4.2.2             Symfony EventDispatcher Component
symfony/filesystem                               v4.2.2             Symfony Filesystem Component
symfony/finder                                   v4.2.2             Symfony Finder Component
symfony/flex                                     v1.1.8             Composer plugin for Symfony
symfony/form                                     v4.2.2             Symfony Form Component
symfony/framework-bundle                         v4.2.2             Symfony FrameworkBundle
symfony/http-foundation                          v4.2.2             Symfony HttpFoundation Component
symfony/http-kernel                              v4.2.2             Symfony HttpKernel Component
symfony/inflector                                v4.2.2             Symfony Inflector Component
symfony/intl                                     v4.2.2             A PHP replacement layer for the C intl extension that includes additional data from the ICU library.
symfony/maker-bundle                             v1.11.3            Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.
symfony/monolog-bridge                           v4.2.2             Symfony Monolog Bridge
symfony/monolog-bundle                           v3.3.1             Symfony MonologBundle
symfony/options-resolver                         v4.2.2             Symfony OptionsResolver Component
symfony/orm-pack                                 v1.0.6             A pack for the Doctrine ORM
symfony/polyfill-intl-icu                        v1.10.0            Symfony polyfill for intl's ICU-related data and classes
symfony/polyfill-mbstring                        v1.10.0            Symfony polyfill for the Mbstring extension
symfony/polyfill-php72                           v1.10.0            Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions
symfony/process                                  v4.2.2             Symfony Process Component
symfony/profiler-pack                            v1.0.4             A pack for the Symfony web profiler
symfony/property-access                          v4.2.2             Symfony PropertyAccess Component
symfony/routing                                  v4.2.2             Symfony Routing Component
symfony/security-bundle                          v4.2.2             Symfony SecurityBundle
symfony/security-core                            v4.2.2             Symfony Security Component - Core Library
symfony/security-csrf                            v4.2.2             Symfony Security Component - CSRF Library
symfony/security-guard                           v4.2.2             Symfony Security Component - Guard
symfony/security-http                            v4.2.2             Symfony Security Component - HTTP Integration
symfony/stopwatch                                v4.2.2             Symfony Stopwatch Component
symfony/swiftmailer-bundle                       v3.2.5             Symfony SwiftmailerBundle
symfony/templating                               v4.2.2             Symfony Templating Component
symfony/translation                              v4.2.2             Symfony Translation Component
symfony/twig-bridge                              v4.2.2             Symfony Twig Bridge
symfony/twig-bundle                              v4.2.2             Symfony TwigBundle
symfony/validator                                v4.2.2             Symfony Validator Component
symfony/var-dumper                               v4.2.2             Symfony mechanism for exploring and dumping PHP variables
symfony/var-exporter                             v4.2.2             A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code
symfony/web-profiler-bundle                      v4.2.2             Symfony WebProfilerBundle
symfony/web-server-bundle                        v4.2.2             Symfony WebServerBundle
symfony/yaml                                     v4.2.2             Symfony Yaml Component

Для ясности - я запускаю этот проект в рабочей среде и использую Apache2 для этой работы.

В моем проекте у меня есть только один .env файл без *.local файлов с переменными окружения. Файл выглядит так:

APP_ENV=prod
APP_SECRET=928374923784mysecretkey92837498273

С этими настройками я не вижу страниц отладки - ПРАВИЛЬНОЕ ПОВЕДЕНИЕ

APP_ENV=prod
APP_DEBUG=1
APP_SECRET=928374923784mysecretkey92837498273

Если я добавлю переменную APP_DEBUG со значением 1 - отобразится страница отладки - ПРАВИЛЬНОЕ ПОВЕДЕНИЕ

Я добавил пользовательскую среду с именем prod1:

APP_ENV=prod1
APP_SECRET=928374923784mysecretkey92837498273

Теперь отладочные страницы отображаются по умолчанию - ПРАВИЛЬНОЕ ПОВЕДЕНИЕ

Я добавил APP_DEBUG = 0:

APP_ENV=prod1
APP_DEBUG=0
APP_SECRET=928374923784mysecretkey92837498273

и страницы отладки не отображаются - ПРАВИЛЬНОЕ ПОВЕДЕНИЕ


Так что, как вы видите, я не могу воспроизвести эту ошибку. В Symfony 4.2.2 вроде бы все работает нормально. Найдите ошибку в вашем проекте или конфигурации веб-сервера, потому что это является причиной проблемы. Я думаю, что вы где-то перезаписываете переменную APP_DEBUG. Возможно в конфигурации виртуального хоста Apache / Nginx:

Больше информации здесь

enter image description here

Как писал Siavas , это также может быть кеш. Попробуйте удалить каталог var/log вручную и запустить composer install


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

0 голосов
/ 29 января 2019

Проблема была в том, что я неправильно настроил ExceptionController в моем проекте:

  1. FOSRestBundle имеет собственный ExceptionController для отображения исключений json / xml

Вы настраиваете это в своем config / fos_rest.yaml:

fos_rest
    exception:
        enabled: true
        exception_controller: 'App\Controller\ExceptionController::handleExceptionAction'
  1. Twig - это ExceptionController по умолчанию для symfony

Вы настраиваете это в своем config / twig.yaml:

twig:
    debug: '%kernel.debug%'
    exception_controller: App\Controller\ExceptionController::showException

Использовался обработчик исключений , который был fos_rest, который я неправильно настроил в моих сервисах. Yaml:

App\Controller\ExceptionController:
  - '@fos_rest.view_handler.default'
  - '@fos_rest.exception.messages_map'
  -  true   <------ this should be '%kernel.debug%'
  - '@templating.engine.twig'
  - '@logger'

Проблема заключалась в том, что третий параметр должен быть % kernel.debug% здесь.

В итоге, В итоге у меня было 2 ExceptionControllers , один для API с ответом в формате json и для Sonata Backend, стандартный контроллер исключений Twig. Единственное решение состояло в том, чтобы переслать запрос от одного контроллера другому:

 <?php

namespace App\Controller;

use Psr\Log\LoggerInterface;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as TwigExceptionController;

class ExceptionController
{
    protected $debug;

    /**
     * @var TwigExceptionController
     */
    protected $twigExceptionController;

    /**
     * @param bool $debug
     * @param TwigExceptionController $twigExceptionController
     */
    public function __construct(
        bool $debug,
        TwigExceptionController $twigExceptionController
    )
    {
        $this->debug = $debug;
        $this->twigExceptionController = $twigExceptionController;
    }

    /**
     * Converts an Exception to a Response.
     *
     * @param Request                   $request
     * @param FlattenException     $exception
     * @param LoggerInterface $logger
     *
     * @return Response
     */
    public function handleExceptionAction(Request $request, FlattenException $exception, LoggerInterface $logger): Response
    {    
        if (!stristr( strtolower($request->getUri()), '/api/')) {
            return $this->twigExceptionController->showAction($request, $exception, $logger);
        }

        $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
        if ($currentContent) {
            $logger->error('current content: '.$currentContent);
        }

        $code = $this->getStatusCode($exception);
        $response = new JsonResponse();
        $response->setStatusCode($code);
        $response->setData([
            'message' => $exception->getMessage(),
            'code' => $code
        ]);
        return $response;
    }


    /**
     * Determines the status code to use for the response.
     *
     * @param \Exception $exception
     *
     * @return int
     */
    protected function getStatusCode($exception): int
    {
        if (method_exists($exception, 'getCode') && $exception->getCode() > 0) {
            return $exception->getCode();
        }
        if (method_exists($exception, 'getStatusCode') && $exception->getStatusCode() > 0) {
            return $exception->getStatusCode();
        }

        return 500;
    }

    /**
     * Gets and cleans any content that was already outputted.
     *
     * This code comes from Symfony and should be synchronized on a regular basis
     * see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
     *
     * @return string
     */
    private function getAndCleanOutputBuffering($startObLevel)
    {
        if (ob_get_level() <= $startObLevel) {
            return '';
        }
        Response::closeOutputBuffers($startObLevel + 1, true);
        return ob_get_clean();
    }
}
0 голосов
/ 27 января 2019

Ваша конфигурация верна.

Скорее всего, это проблема с кэшированием: попробуйте запустить php bin/console cache:clear.

...