如何找出 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 变量,但你应该能够看到它正如我所描述的内容,所以对导致捆绑文件无法加载的代码错误有一个很好的了解。
我分享这个问题,因为这是一个特别棘手的编码问题。
我过去有几次收到错误提示:
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 变量,但你应该能够看到它正如我所描述的内容,所以对导致捆绑文件无法加载的代码错误有一个很好的了解。