Can*_*asa 563 php debugging error-handling
我觉得用PHP编程非常令人沮丧.我经常尝试运行脚本,然后再回一个空白屏幕.没有错误消息,只是空屏幕.原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或其他完全错误.
弄清楚出了什么问题是非常困难的.我最终评论出代码,在任何地方输入"echo"语句等等,试图缩小问题范围.但肯定有一个更好的方法,对吗?
那么,有没有办法让PHP产生像Java那样有用的错误信息呢?任何人都可以推荐良好的PHP调试技巧,工具和技术?
Dar*_*ein 483
对于语法错误,您需要在php.ini中启用错误显示.默认情况下,这些是关闭的,因为您不希望"客户"看到错误消息.有关2指令的信息,请查看 PHP文档中的此页面:error_reporting和display_errors.display_errors可能是你想改变的那个.如果无法修改php.ini,还可以将以下行添加到.htaccess文件中:
php_flag display_errors on
php_value error_reporting 2039
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑使用E_ALL的值(如Gumbo所述)为您的PHP版本error_reporting获取所有错误.更多信息
3其他项目:(1)您可以检查错误日志文件,因为它将包含所有错误(除非已禁用日志记录).(2)添加以下2行将帮助您调试非语法错误的错误:
error_reporting(-1);
ini_set('display_errors', 'On');
Run Code Online (Sandbox Code Playgroud)
(3)另一种选择是使用一个编辑器,在你输入时检查错误,例如PhpEd.PhpEd还带有一个调试器,可以提供更详细的信息.(PhpEd调试器与xdebug非常相似,并直接集成到编辑器中,因此您可以使用1个程序来完成所有操作.)
Cartman的链接也非常好:http://www.ibm.com/developerworks/library/os-debug/
Elj*_*kim 446
以下内容可启用所有错误:
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
Run Code Online (Sandbox Code Playgroud)
另请参阅以下链接
小智 174
以下代码应显示所有错误:
<?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
?>
Run Code Online (Sandbox Code Playgroud)
使用此代码生成空白页的唯一方法是在关闭处理程序中出现错误.我在没有测试的情况下从我自己的cms复制并粘贴了它,但我确信它有效.
Jam*_*son 60
错误和警告通常出现在....\logs\php_error.log或....\logs\apache_error.log取决于您的php.ini设置.
有用的错误通常也会定向到浏览器,但由于它们不是有效的html,因此不会显示.
所以"tail -f"你的日志文件和当你得到一个空白的屏幕使用IE浏览器" - >"源"菜单选项来查看原始输出.
Tom*_*lak 57
您可以在要调试的文件中包含以下行:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Run Code Online (Sandbox Code Playgroud)
这会覆盖php.ini中的默认设置,这只会让PHP将错误报告给日志.
Mad*_*iha 52
php.ini中的 2个条目指示错误输出:
在生产中,display_errors通常设置为Off(这是一件好事,因为生产站点中的错误显示通常是不可取的!).
但是,在开发中,应将其设置为On,以便显示错误.检查!
error_reporting(从PHP 5.3开始)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(意味着除了通知,严格标准和弃用通知之外的所有内容都会显示).如有疑问,请将其设置E_ALL为显示所有错误.检查!
真是太遗憾了.通常共享主机不允许更改其php.ini文件,因此,该选项很遗憾.但不要害怕!我们还有其他选择!
在所需的脚本中,我们可以在运行时更改php.ini条目!意思是,它会在脚本运行时运行!甜!
error_reporting(E_ALL);
ini_set("display_errors", "On");Run Code Online (Sandbox Code Playgroud)
这两行与改变上面的php.ini条目效果相同!真棒!
这意味着脚本甚至没有运行!当您遇到语法错误时,通常会发生这种情况!
由于语法错误,脚本甚至无法进入运行时.它在编译时失败,这意味着它将使用php.ini中的值,如果您没有更改,则可能不允许显示错误.
此外,PHP默认记录错误.在共享主机中,它可能位于专用文件夹中,也可能位于与违规脚本相同的文件夹中.
如果您有权访问php.ini,可以在error_log条目下找到它.
FDi*_*isk 30
我总是在php脚本的顶部使用这种语法.
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On'); //On or Off
Run Code Online (Sandbox Code Playgroud)
hak*_*kre 27
为了快速,实际的故障排除我通常在这里建议SO:
error_reporting(~0); ini_set('display_errors', 1);
Run Code Online (Sandbox Code Playgroud)
放在故障排除脚本的开头.这并不完美,完美的变体是您还可以php.ini在PHP中记录错误以捕获语法和启动错误.
此处列出的设置显示所有错误,通知和警告,包括严格的错误,无论哪个PHP版本.
接下来要考虑的事情:
另见:
Edu*_*ira 27
可以注册一个钩子以使最后一个错误或警告可见.
function shutdown(){
var_dump(error_get_last());
}
register_shutdown_function('shutdown');
Run Code Online (Sandbox Code Playgroud)
将此代码添加到index.php的开头将帮助您调试问题.
She*_*rif 18
重要的是要认识到在编译或解析步骤期间发生语法错误或解析错误,这意味着PHP将在它甚至有机会执行您的任何代码之前保释.因此,如果您display_errors在运行时修改PHP的配置(这包括从使用ini_set代码到使用.htaccess,这是运行时配置文件),那么只有默认加载的配置设置正在运行.
要避免使用WSOD,您需要确保已加载的配置文件已display_errors打开并error_reporting设置为-1(这是等效的E_ALL,因为它确保所有位都打开,无论您运行的是哪个版本的PHP).不要硬编码E_ALL的常量值,因为该值可能会在不同版本的PHP之间发生变化.
加载的配置是您加载的php.ini文件或您的apache.conf或httpd.conf或虚拟主机文件.这些文件只在启动阶段(例如,当您第一次启动apache httpd或php-fpm时)读取一次,并且仅被运行时配置更改覆盖.确保display_errors = 1与error_reporting = -1您加载的配置文件可以确保你永远不会看到一个WSOD不管语法或解析像一个运行时的变化之前出现的错误ini_set('display_errors', 1);或error_reporting(E_ALL);可能发生.
要找到已加载的配置文件,只需使用以下代码创建一个新的PHP文件...
<?php
phpinfo();
Run Code Online (Sandbox Code Playgroud)
然后将浏览器指向那里并查看已解析的已加载配置文件和其他.ini文件,这些文件通常位于您的顶部,phpinfo()并将包含所有已加载配置文件的绝对路径.
如果您看到(none)而不是文件,这意味着您在配置文件(php.ini)路径中没有php.ini.所以你可以从这里下载与PHP捆绑的股票php.ini并将其作为php.ini复制到你的配置文件路径,然后确保你的php用户有足够的权限从该文件中读取.您需要重新启动httpd或php-fpm才能加载它.请记住,这是与PHP源捆绑在一起的开发 php.ini文件.所以请不要在生产中使用它!
这确实是避免开发WSOD的最佳方法.任何人建议您放置ini_set('display_errors', 1);或error_reporting(E_ALL);放在PHP脚本的顶部或使用.htaccess,就像您在此处所做的那样,如果加载的配置文件出现语法或解析错误(如此处的情况),则无法帮助您避免WSOD已经display_errors关闭了.
许多人(以及PHP的库存安装)将使用display_errors默认关闭的production-ini文件,这通常会导致您在此遇到的同样挫折.因为PHP在启动时已经关闭了它,然后遇到语法或解析错误,并且没有任何输出就会失败.您希望ini_set('display_errors',1);PHP脚本的顶部应该避免这种情况,但是如果PHP无法解析您的代码也无关紧要,因为它永远不会到达运行时.
Ric*_*haw 17
如果你很酷,你可以尝试:
$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);
Run Code Online (Sandbox Code Playgroud)
这只会在您本地运行时显示错误.它还为您提供了test_server变量,以便在适当的地方使用.
在脚本运行之前发生的任何错误都不会被捕获,但是对于我所犯的99%的错误,这不是问题.
Kld*_*Kld 17
在页面顶部选择一个参数
error_reporting(E_ERROR | E_WARNING | E_PARSE);
Run Code Online (Sandbox Code Playgroud)
Eli*_*Eli 16
Dunno,如果它会有所帮助,但这里是一个我的标准配置文件的PHP项目.即使在我自己的服务器上,我也不会太依赖apache配置.
我从来没有消失的错误问题,所以也许这里的东西会给你一个想法.
编辑显示APPLICATON_LIVE
/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment. It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/
if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
define('APPLICATION_LIVE', false);
} else {
die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
// Log or take other appropriate action.
}
/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging. Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
if ( ! APPLICATION_LIVE ) {
// A few changes to error handling for development.
// We will want errors to be visible during development.
ini_set ( "display_errors", "1");
ini_set ( "display_startup_errors", "1");
ini_set ( "html_errors", "1");
ini_set ( "docref_root", "http://www.php.net/");
ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
ini_set ( "error_append_string", "</div>");
}
Run Code Online (Sandbox Code Playgroud)
Ram*_*Ram 16
要坚持这个并使其成为confortale,您可以编辑php.ini文件.它通常存储在/etc/php.ini或中/etc/php/php.ini,但更多本地人php.ini可能会覆盖它,具体取决于您的托管服务提供商的设置指南.检查顶部的phpinfo()文件Loaded Configuration File,以确定最后加载哪个文件.
在该文件中搜索display_errors.应该只有3个实例,其中2个被评论.
将未注释的行更改为:
display_errors = stdout
Run Code Online (Sandbox Code Playgroud)
小智 15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用xdebug获取更多详细信息.
Ond*_*tek 15
我建议使用Nette Tracy更好地可视化PHP中的错误和异常:

Abu*_*usi 15
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
Óla*_*age 10
error_reporting(E_ALL | E_STRICT);
Run Code Online (Sandbox Code Playgroud)
并打开php.ini中的显示错误
您可以在PHP中注册自己的错误处理程序.例如,将所有错误转储到文件可能会帮助您处理这些模糊的情况.请注意,无论您当前的error_reporting设置为什么,都会调用您的函数.非常基本的例子:
function dump_error_to_file($errno, $errstr) {
file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
Run Code Online (Sandbox Code Playgroud)
小智 7
从PHP中获取有用错误所需的两个关键行是:
ini_set('display_errors',1);
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
正如其他贡献者所指出的那样,出于安全原因,这些默认情况下会被关闭.作为一个有用的提示 - 当您设置站点时,可以方便地为不同的环境进行切换,以便在本地和开发环境中默认启用这些错误.这可以通过以下代码实现(理想情况下,在index.php或配置文件中,因此从一开始就是活动的):
switch($_SERVER['SERVER_NAME'])
{
// local
case 'yourdomain.dev':
// dev
case 'dev.yourdomain.com':
ini_set('display_errors',1);
error_reporting(E_ALL);
break;
//live
case 'yourdomain.com':
//...
break;
}
Run Code Online (Sandbox Code Playgroud)
如果您是ubuntu用户,请转到终端并运行此命令
sudo tail -50f /var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)
它将显示最近50个错误.error.logapache2 有一个错误文件,记录所有错误.
要打开完整的错误报告,请将其添加到脚本中:
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
这甚至会显示最小的警告。并且,以防万一:
ini_set('display_errors', '1');
Run Code Online (Sandbox Code Playgroud)
会强制显示错误。应该在生产服务器中将其关闭,但在开发时则不应将其关闭。
小智 5
对于开发人员来说,“错误”是最有用的知识,他们可以了解他们的错误并解决它们,以使系统完美运行。
PHP提供了一些更好的方法来了解开发人员代码为何以及在何处出现错误,因此,通过了解这些错误,开发人员可以通过多种方式使他们的代码变得更好。
在脚本顶部编写以下两行以获取所有错误消息的最佳方法:
error_reporting(E_ALL);
ini_set("display_errors", 1);
Run Code Online (Sandbox Code Playgroud)
在IDE中使用调试器工具(如xdebug)的另一种方法。
除了这里所有精彩的答案之外,我还想特别提及 MySQLi 和 PDO 库。
为了...
最好的选择是将库配置为抛出异常。
将其添加到脚本顶部附近
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Run Code Online (Sandbox Code Playgroud)
最好将其放在使用new mysqli()或之前mysqli_connect()。
PDO::ATTR_ERRMODE将属性设置PDO::ERRMODE_EXCEPTION为您的连接实例。您可以在构造函数中执行此操作
$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
Run Code Online (Sandbox Code Playgroud)
或创建后
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
570619 次 |
| 最近记录: |