如何找出 Symfony v2.8 创建的网页未加载的原因?

how to find out why webpage created by Symfony v2.8 isn't loading?

我分享这个问题,因为这是一个特别棘手的编码问题。

我过去有几次收到错误提示:

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 && $error['type'] &= 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 && self::$exitCode) {
        $exitCode = self::$exitCode;
        register_shutdown_function('register_shutdown_function', function () use ($exitCode) { exit($exitCode); });
    }
}

当 Symfony 试图在其代码的另一部分使用 require $file 语句加载我的包文件时,将调用上述函数。不幸的是,我看不到 $error 或任何其他变量,但是当遇到断点时,我的调试器确实显示了 $error[=33 的内容=]变量在它被赋值为error_get_last();的行上。尽管内容是一个数组,超出了我屏幕的右边缘,但它的显示足以找出问题所在。不显示行号,但显示错误文本。

我在查找错误时发现的另一件事是服务器 src/AppBundle./Controller/ 及以下的所有 PHP 文件都由 Symfony 处理,因此如果您将代码保存在文件中使用 *.php 它将被加载,即使它没有被您的代码引用。在我的例子中,我有一个捆绑文件,我从 bundle.php 重命名为 bundle.24.php,打算在我继续对 bundle.php 进行新更改时将其作为后备,但 bundle. 24.php 有一个语法错误,它阻止了 Symfony 加载项目,但我没有意识到这一点,因为我得到了我在本期顶部显示的错误。

无论如何,我想我会与在使用 Symfony v2.8 时遇到同样错误的任何人分享这个。我希望 Symfony 的更高版本不会继续以这种方式工作,但如果他们这样做,那么这里有一个线索,可以知道在哪里查看或可能导致问题的原因。请注意,在以后的版本中,我确定处理函数可能与我展示的不同,但应该有些相似。

祝你好运。

当您在 Symfony 中遇到此类错误时,解决方案是在 app_dev.php 的 $response->send(); 调用的代码中放置断点;行,然后遍历代码,直到找到 require $file; 行。使用您的 PHP 调试器观察 $file 和 $class 变量,您会看到 require 语句即将加载您的代码文件。如果它跳转到错误处理函数,你就会知道代码没有加载,正如我在问题中所说,你将无法看到 $error 变量,但你应该能够看到它正如我所描述的内容,所以对导致捆绑文件无法加载的代码错误有一个很好的了解。