как узнать, почему веб-страница, созданная Symfony v2.8, не загружается?

#compiler-errors #is-empty #symfony-2.8

#ошибки компилятора #есть-пусто #symfony-2.8

Вопрос:

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

В прошлом я несколько раз получал сообщение об ошибке:

 This page isn’t working
website.com didn’t send any data.
ERR_EMPTY_RESPONSE
 

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

На этот раз я отследил причину ошибки, установив точки останова, не в коде, который я редактировал, потому что php xdebugger никогда не заходил так далеко, а глубоко в коде Symfony, который выполняется до того, как мой код действительно будет выполнен. Вот код, в который я ставлю точку останова:

 public static function handleFatalError(array $error = null)
{
    if (null === self::$reservedMemory) {
        return;
    }

    self::$reservedMemory = null;

    $handler = set_error_handler('var_dump');
    $handler = is_array($handler) ? $handler[0] : null;
    restore_error_handler();

    if (!$handler instanceof self) {
        return;
    }

    if ($exit = null === $error) {
        $error = error_get_last();
    }

    try {
        while (self::$stackedErrorLevels) {      <<<< I put the breakpoint here!
            static::unstackErrors();
        }
    } catch (Exception $exception) {
        // Handled below
    } catch (Throwable $exception) {
        // Handled below
    }

    if ($error amp;amp; $error['type'] amp;= E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR) {
        // Let's not throw anymore but keep logging
        $handler->throwAt(0, true);
        $trace = isset($error['backtrace']) ? $error['backtrace'] : null;

        if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
            $exception = new OutOfMemoryException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false, $trace);
        } else {
            $exception = new FatalErrorException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true, $trace);
        }
    }

    try {
        if (isset($exception)) {
            self::$exitCode = 255;
            $handler->handleException($exception, $error);
        }
    } catch (FatalErrorException $e) {
        // Ignore this re-throw
    }

    if ($exit amp;amp; self::$exitCode) {
        $exitCode = self::$exitCode;
        register_shutdown_function('register_shutdown_function', function () use ($exitCode) { exit($exitCode); });
    }
}
 

Когда Symfony пытается загрузить мой файл пакета с require $file помощью инструкции в другой части своего кода, вызывается вышеупомянутая функция. К сожалению, я не смог просмотреть $error или любую другую переменную, но когда была обнаружена точка останова, мой отладчик показывает содержимое переменной $error в строке, где ей присваивается значение error_get_last(); . Несмотря на то, что содержимое представляет собой массив, который выходит за пределы правого края моего экрана, его отображается достаточно, чтобы определить проблему. Номер строки не отображается, но отображается текст ошибки.

Еще одна вещь, которую я обнаружил при поиске ошибки, заключается в том, что все PHP-файлы на сервере src/AppBundle./Controller/ и ниже обрабатываются Symfony, поэтому, если вы сохраняете свой код в файлах, заканчивающихся на *.php, он будет загружен, даже если на него не ссылается ваш код. В моем случае у меня был файл пакета, который я переименовал из bundle.php чтобы bundle.24.php , намереваясь сохранить его в качестве запасного варианта, пока я продолжу работать над новыми изменениями в bundle.php , но bundle.24.php была синтаксическая ошибка, которая остановила загрузку проекта Symfony, но я не знал об этом, потому что получил сообщение об ошибкеэто я показал в начале этой проблемы.

В любом случае, я подумал, что поделюсь этим со всеми, кто сталкивается с такой же ошибкой при работе с Symfony v2.8. Я надеюсь, что более поздние версии Symfony не будут продолжать работать таким образом, но если они это сделают, что ж, тогда вот подсказка, где искать или что может быть причиной проблемы. Обратите внимание, что в более поздних версиях я уверен, что функция обработчика может отличаться от того, что я показываю, но она должна быть какой-то похожей.

Удачи.

Ответ №1:

Решение, когда вы получаете такого рода ошибки в Symfony, заключается в размещении точек останова в коде, который вызывается app_dev.php строка ‘s $response->send();, а затем просматривайте код, пока не require $file; исправите строку. Используйте ваш PHP-отладчик для просмотра переменных $file и $class, и вы увидите, что оператор require собирается загрузить ваш файл кода. Если он перейдет к функции обработчика ошибок, вы будете знать, что код не загрузился, и, как я уже говорил в выпуске, вы не сможете просмотреть переменную $error, но вы должны иметь возможность видеть ее содержимое, как я описал, так что у вас есть довольно хорошее представление оошибка кода, из-за которой файл пакета не загружается.