我经常会尝试运行一个php脚本,然后返回一个空白屏幕。无错误信息;只是一个空屏幕。原因可能是一个简单的语法错误(括号错误,缺少分号),或者函数调用失败,或者完全是其他原因。很难找出哪里出了问题。最后我注解掉代码,到处输入“echo”语句等等,试图缩小问题的范围。但肯定有更好的办法,对吧?有没有办法让php像java那样生成有用的错误消息?
flvlnr441#
如果你超级酷,你可以尝试:
$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192"; ini_set('display_errors',$test_server); error_reporting(E_ALL|E_STRICT);
这只会在本地运行时显示错误。它还为您提供了test\u server变量,以便在其他适当的地方使用。在脚本运行之前发生的任何错误都不会被捕获,但是对于我所犯的99%的错误来说,这不是问题。
enyaitl32#
对于语法错误,需要在php.ini中启用错误显示。默认情况下,这些选项是关闭的,因为您不希望“客户”看到错误消息。请查看php文档中的此页,以获取有关2个指令的信息: error_reporting 以及 display_errors . display_errors 可能是你想换的。如果无法修改php.ini,还可以将以下行添加到.htaccess文件中:
error_reporting
display_errors
php_flag display_errors on php_value error_reporting 2039
您可能需要考虑在php for的版本中使用e_all的值(正如gumbo所提到的) error_reporting 获取所有错误。更多信息其他3项:(1)您可以检查错误日志文件,因为它将包含所有错误(除非已禁用日志记录)(2) 添加以下两行将帮助您调试非语法错误的错误:
error_reporting(-1); ini_set('display_errors', 'On');
(3) 另一个选择是使用一个编辑器来检查输入时的错误,例如phped。phped还附带了一个调试器,可以提供更详细的信息(phped调试器与xdebug非常相似,它直接集成到编辑器中,因此您可以使用一个程序来完成所有操作。)cartman的链接也非常好:http://www.ibm.com/developerworks/library/os-debug/
kx5bkwkv3#
有一个非常有用的扩展名为“xdebug”,它也可以使您的报告变得更好。
j8yoct9x4#
在页面顶部选择一个参数
error_reporting(E_ERROR | E_WARNING | E_PARSE);
qcuzuvrc5#
认识到语法错误或解析错误发生在编译或解析步骤中是很重要的,这意味着php甚至在有机会执行任何代码之前就会退出。所以如果你修改php的 display_errors 在运行时进行配置(包括使用 ini_set 在使用.htaccess(运行时配置文件)的代码中,只有默认加载的配置设置才起作用。
ini_set
要避免wsod,您需要确保加载的配置文件 display_errors 在和 error_reporting 设置为 -1 (这是等效的eèall,因为它确保无论运行哪个版本的php,所有位都处于打开状态)。不要硬编码e\u all的常量值,因为该值在不同版本的php之间可能会发生变化。已加载的配置是 php.ini 文件或您的 apache.conf 或者 httpd.conf 或virtualhost文件。这些文件在启动阶段(例如,当您第一次启动apachehttpd或phpfpm时)只读取一次,并且只被运行时配置更改覆盖。确保 display_errors = 1 以及 error_reporting = -1 在您加载的配置文件中,确保您永远不会看到wsod,而不管在运行时更改之前发生的语法或解析错误,如 ini_set('display_errors', 1); 或者 error_reporting(E_ALL); 可能发生。
-1
php.ini
apache.conf
httpd.conf
display_errors = 1
error_reporting = -1
ini_set('display_errors', 1);
error_reporting(E_ALL);
要定位加载的配置文件,只需使用以下代码创建一个新的php文件。。。
<?php phpinfo();
然后将浏览器指向那里,查看加载的配置文件和解析的其他.ini文件,这些文件通常位于页面顶部 phpinfo() 并将包含所有已加载配置文件的绝对路径。如果你看到 (none) 而不是文件,这意味着您在配置文件(php.ini)路径中没有php.ini。因此,您可以从这里下载与php捆绑在一起的stock php.ini,并将其作为php.ini复制到配置文件路径中,然后确保您的php用户有足够的权限读取该文件。您需要重新启动httpd或php-fpm来加载它。请记住,这是php源代码附带的development php.ini文件。所以请不要在生产中使用它!
phpinfo()
(none)
这确实是避免开发中出现wsod的最佳方法。有人建议你 ini_set('display_errors', 1); 或者 error_reporting(E_ALL); 在php脚本的顶部,或者像您在这里所做的那样使用.htaccess,并不能帮助您避免在发生语法或解析错误时出现wsod(就像您在这里的例子),如果您加载的配置文件 display_errors 已关闭。许多人(和股票安装的php)将使用一个生产ini文件,该文件具有 display_errors 默认情况下关闭,这通常会导致与您在这里经历的相同的挫折感。因为php已经在启动时关闭了它,然后遇到语法或解析错误,并且没有输出。你希望你的 ini_set('display_errors',1); 在php脚本的顶部,应该避免这种情况,但是如果php不能解析您的代码,则无关紧要,因为它永远不会到达运行时。
ini_set('display_errors',1);
qc6wkl3g6#
错误和警告通常出现在 ....\logs\php_error.log 或者 ....\logs\apache_error.log 取决于php.ini设置。此外,有用的错误通常会指向浏览器,但由于它们不是有效的html,因此不会显示。所以呢 "tail -f 你的日志文件,当你得到一个空白屏幕使用ies“查看”->“源”菜单选项来查看原始输出。
....\logs\php_error.log
....\logs\apache_error.log
"tail -f
wfauudbj7#
以下代码应显示所有错误:
<?php // ---------------------------------------------------------------------------------------------------- // - Display Errors // ---------------------------------------------------------------------------------------------------- ini_set('display_errors', 'On'); ini_set('html_errors', 0); // ---------------------------------------------------------------------------------------------------- // - Error Reporting // ---------------------------------------------------------------------------------------------------- error_reporting(-1); // ---------------------------------------------------------------------------------------------------- // - Shutdown Handler // ---------------------------------------------------------------------------------------------------- function ShutdownHandler() { if(@is_array($error = @error_get_last())) { return(@call_user_func_array('ErrorHandler', $error)); }; return(TRUE); }; register_shutdown_function('ShutdownHandler'); // ---------------------------------------------------------------------------------------------------- // - Error Handler // ---------------------------------------------------------------------------------------------------- function ErrorHandler($type, $message, $file, $line) { $_ERRORS = Array( 0x0001 => 'E_ERROR', 0x0002 => 'E_WARNING', 0x0004 => 'E_PARSE', 0x0008 => 'E_NOTICE', 0x0010 => 'E_CORE_ERROR', 0x0020 => 'E_CORE_WARNING', 0x0040 => 'E_COMPILE_ERROR', 0x0080 => 'E_COMPILE_WARNING', 0x0100 => 'E_USER_ERROR', 0x0200 => 'E_USER_WARNING', 0x0400 => 'E_USER_NOTICE', 0x0800 => 'E_STRICT', 0x1000 => 'E_RECOVERABLE_ERROR', 0x2000 => 'E_DEPRECATED', 0x4000 => 'E_USER_DEPRECATED' ); if(!@is_string($name = @array_search($type, @array_flip($_ERRORS)))) { $name = 'E_UNKNOWN'; }; return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message))); }; $old_error_handler = set_error_handler("ErrorHandler"); // other php code ?>
使用此代码生成空白页的唯一方法是在关闭处理程序中出现错误时。我复制并粘贴了我自己的cms没有测试它,但我相信它的工作。
9vw9lbht8#
我总是在php脚本的最顶层使用这种语法。
ini_set('error_reporting', E_ALL); ini_set('display_errors', 'On'); //On or Off
eeq64g8w9#
对于快速、实际的故障排除,我通常建议如下:
error_reporting(~0); ini_set('display_errors', 1);
要放在脚本的开头,正在进行故障排除。这是不完美的,完美的变种是,你也能在 php.ini 在php中记录错误以捕获语法和启动错误。这里列出的设置显示所有错误、通知和警告,包括严格的错误、通知和警告,而不管是哪个php版本。接下来要考虑的事项:安装xdebug并使用ide启用远程调试。另请参见:错误报告(正确的方法)预定义的constantsdocs error_reporting() 文件 display_errors 文件
error_reporting()
ttcibm8c10#
为了保持这种状态并使其更容易理解,您可以编辑php.ini文件。通常储存在 /etc/php.ini 或者 /etc/php/php.ini ,但更具地方性 php.ini 的可能会覆盖它,具体取决于宿主提供商的设置准则。检查a phpinfo() 文件 Loaded Configuration File 在最上面,确定哪一个最后上膛。搜索该文件中的显示错误。应该只有3个示例,其中2个是注解的。将未注解行更改为:
/etc/php.ini
/etc/php/php.ini
Loaded Configuration File
display_errors = stdout
jvlzgdj911#
php.ini中的2个条目指示错误的输出:display_errors error_reporting 在生产中, display_errors 通常设置为 Off (这是一件好事,因为在生产站点中显示错误通常是不可取的!)。然而,在发展中,它应该被设定为 On ,以便显示错误。检查! error_reporting (从PHP5.3开始)默认设置为 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (也就是说,除了通知、严格标准和弃用通知之外,所有内容都会显示出来)。如果有疑问,请将其设置为 E_ALL 显示所有错误。检查!
Off
On
E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
E_ALL
真可惜。通常共享主机不允许更改它们的php.ini文件,因此,遗憾的是,该选项不可用。但不要害怕!我们还有其他选择!
在所需的脚本中,我们可以在运行时更改php.ini条目!意思是,它会在脚本运行时运行!太好了!
error_reporting(E_ALL); ini_set("display_errors", "On");
这两行的效果与上面修改php.ini条目的效果相同!令人惊叹的!
那意味着剧本还没开始呢!这通常发生在你有语法错误的时候!由于语法错误,脚本甚至无法进入运行时。它在编译时失败,这意味着它将使用php.ini中的值,如果没有更改,可能不允许显示错误。
另外,php默认记录错误。在共享托管中,它可能位于专用文件夹中,也可能与违规脚本位于同一文件夹中。如果您有权访问php.ini,可以在 error_log 进入。
error_log
oprakyz712#
可以注册一个钩子来显示最后一个错误或警告。
function shutdown(){ var_dump(error_get_last()); } register_shutdown_function('shutdown');
将此代码添加到index.php的开头将帮助您调试问题。
mwngjboj13#
我推荐内特·特拉
xyhw6mcr14#
error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); ini_set('html_errors', 1);
此外,可以使用xdebug获得更详细的信息。
eimct9ow15#
以下选项启用所有错误:
ini_set('display_startup_errors', 1); ini_set('display_errors', 1); error_reporting(-1);
另请参见以下链接http://php.net/manual/en/errorfunc.configuration.php#ini.display-错误http://php.net/manual/en/errorfunc.configuration.php#ini.display-启动错误http://php.net/manual/en/function.error-reporting.php
17条答案
按热度按时间flvlnr441#
如果你超级酷,你可以尝试:
这只会在本地运行时显示错误。它还为您提供了test\u server变量,以便在其他适当的地方使用。
在脚本运行之前发生的任何错误都不会被捕获,但是对于我所犯的99%的错误来说,这不是问题。
enyaitl32#
对于语法错误,需要在php.ini中启用错误显示。默认情况下,这些选项是关闭的,因为您不希望“客户”看到错误消息。请查看php文档中的此页,以获取有关2个指令的信息:
error_reporting
以及display_errors
.display_errors
可能是你想换的。如果无法修改php.ini,还可以将以下行添加到.htaccess文件中:您可能需要考虑在php for的版本中使用e_all的值(正如gumbo所提到的)
error_reporting
获取所有错误。更多信息其他3项:(1)您可以检查错误日志文件,因为它将包含所有错误(除非已禁用日志记录)(2) 添加以下两行将帮助您调试非语法错误的错误:
(3) 另一个选择是使用一个编辑器来检查输入时的错误,例如phped。phped还附带了一个调试器,可以提供更详细的信息(phped调试器与xdebug非常相似,它直接集成到编辑器中,因此您可以使用一个程序来完成所有操作。)
cartman的链接也非常好:http://www.ibm.com/developerworks/library/os-debug/
kx5bkwkv3#
有一个非常有用的扩展名为“xdebug”,它也可以使您的报告变得更好。
j8yoct9x4#
在页面顶部选择一个参数
qcuzuvrc5#
这是一个加载与运行时配置的问题
认识到语法错误或解析错误发生在编译或解析步骤中是很重要的,这意味着php甚至在有机会执行任何代码之前就会退出。所以如果你修改php的
display_errors
在运行时进行配置(包括使用ini_set
在使用.htaccess(运行时配置文件)的代码中,只有默认加载的配置设置才起作用。如何在开发中避免wsod
要避免wsod,您需要确保加载的配置文件
display_errors
在和error_reporting
设置为-1
(这是等效的eèall,因为它确保无论运行哪个版本的php,所有位都处于打开状态)。不要硬编码e\u all的常量值,因为该值在不同版本的php之间可能会发生变化。已加载的配置是
php.ini
文件或您的apache.conf
或者httpd.conf
或virtualhost文件。这些文件在启动阶段(例如,当您第一次启动apachehttpd或phpfpm时)只读取一次,并且只被运行时配置更改覆盖。确保display_errors = 1
以及error_reporting = -1
在您加载的配置文件中,确保您永远不会看到wsod,而不管在运行时更改之前发生的语法或解析错误,如ini_set('display_errors', 1);
或者error_reporting(E_ALL);
可能发生。如何找到(php.ini)加载的配置文件
要定位加载的配置文件,只需使用以下代码创建一个新的php文件。。。
然后将浏览器指向那里,查看加载的配置文件和解析的其他.ini文件,这些文件通常位于页面顶部
phpinfo()
并将包含所有已加载配置文件的绝对路径。如果你看到
(none)
而不是文件,这意味着您在配置文件(php.ini)路径中没有php.ini。因此,您可以从这里下载与php捆绑在一起的stock php.ini,并将其作为php.ini复制到配置文件路径中,然后确保您的php用户有足够的权限读取该文件。您需要重新启动httpd或php-fpm来加载它。请记住,这是php源代码附带的development php.ini文件。所以请不要在生产中使用它!只是不要在生产中这样做
这确实是避免开发中出现wsod的最佳方法。有人建议你
ini_set('display_errors', 1);
或者error_reporting(E_ALL);
在php脚本的顶部,或者像您在这里所做的那样使用.htaccess,并不能帮助您避免在发生语法或解析错误时出现wsod(就像您在这里的例子),如果您加载的配置文件display_errors
已关闭。许多人(和股票安装的php)将使用一个生产ini文件,该文件具有
display_errors
默认情况下关闭,这通常会导致与您在这里经历的相同的挫折感。因为php已经在启动时关闭了它,然后遇到语法或解析错误,并且没有输出。你希望你的ini_set('display_errors',1);
在php脚本的顶部,应该避免这种情况,但是如果php不能解析您的代码,则无关紧要,因为它永远不会到达运行时。qc6wkl3g6#
错误和警告通常出现在
....\logs\php_error.log
或者....\logs\apache_error.log
取决于php.ini设置。此外,有用的错误通常会指向浏览器,但由于它们不是有效的html,因此不会显示。
所以呢
"tail -f
你的日志文件,当你得到一个空白屏幕使用ies“查看”->“源”菜单选项来查看原始输出。wfauudbj7#
以下代码应显示所有错误:
使用此代码生成空白页的唯一方法是在关闭处理程序中出现错误时。我复制并粘贴了我自己的cms没有测试它,但我相信它的工作。
9vw9lbht8#
我总是在php脚本的最顶层使用这种语法。
eeq64g8w9#
对于快速、实际的故障排除,我通常建议如下:
要放在脚本的开头,正在进行故障排除。这是不完美的,完美的变种是,你也能在
php.ini
在php中记录错误以捕获语法和启动错误。这里列出的设置显示所有错误、通知和警告,包括严格的错误、通知和警告,而不管是哪个php版本。
接下来要考虑的事项:
安装xdebug并使用ide启用远程调试。
另请参见:
错误报告(正确的方法)
预定义的constantsdocs
error_reporting()
文件display_errors
文件ttcibm8c10#
为了保持这种状态并使其更容易理解,您可以编辑php.ini文件。通常储存在
/etc/php.ini
或者/etc/php/php.ini
,但更具地方性php.ini
的可能会覆盖它,具体取决于宿主提供商的设置准则。检查aphpinfo()
文件Loaded Configuration File
在最上面,确定哪一个最后上膛。搜索该文件中的显示错误。应该只有3个示例,其中2个是注解的。
将未注解行更改为:
jvlzgdj911#
php配置
php.ini中的2个条目指示错误的输出:
display_errors
error_reporting
在生产中,display_errors
通常设置为Off
(这是一件好事,因为在生产站点中显示错误通常是不可取的!)。然而,在发展中,它应该被设定为
On
,以便显示错误。检查!error_reporting
(从PHP5.3开始)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
(也就是说,除了通知、严格标准和弃用通知之外,所有内容都会显示出来)。如果有疑问,请将其设置为E_ALL
显示所有错误。检查!哇,哇!没有支票!我无法更改我的php.ini!
真可惜。通常共享主机不允许更改它们的php.ini文件,因此,遗憾的是,该选项不可用。但不要害怕!我们还有其他选择!
运行时配置
在所需的脚本中,我们可以在运行时更改php.ini条目!意思是,它会在脚本运行时运行!太好了!
这两行的效果与上面修改php.ini条目的效果相同!令人惊叹的!
我仍然得到一个空白页/500错误!
那意味着剧本还没开始呢!这通常发生在你有语法错误的时候!
由于语法错误,脚本甚至无法进入运行时。它在编译时失败,这意味着它将使用php.ini中的值,如果没有更改,可能不允许显示错误。
错误日志
另外,php默认记录错误。在共享托管中,它可能位于专用文件夹中,也可能与违规脚本位于同一文件夹中。
如果您有权访问php.ini,可以在
error_log
进入。oprakyz712#
可以注册一个钩子来显示最后一个错误或警告。
将此代码添加到index.php的开头将帮助您调试问题。
mwngjboj13#
我推荐内特·特拉
xyhw6mcr14#
此外,可以使用xdebug获得更详细的信息。
eimct9ow15#
以下选项启用所有错误:
另请参见以下链接
http://php.net/manual/en/errorfunc.configuration.php#ini.display-错误
http://php.net/manual/en/errorfunc.configuration.php#ini.display-启动错误
http://php.net/manual/en/function.error-reporting.php