我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
当前回答
你需要从PHP中获取有用错误的两行关键代码是:
ini_set('display_errors',1);
error_reporting(E_ALL);
正如其他贡献者所指出的那样,出于安全原因,这些功能在默认情况下是关闭的。作为一个有用的技巧——当你设置你的网站时,为你的不同环境做一个切换是很方便的,这样在你的本地和开发环境中,这些错误默认是打开的。这可以通过以下代码实现(理想情况下是在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;
}
其他回答
您可以在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');
PHP配置
php.ini中的2个条目指示错误的输出:
display_errors error_reporting
在生产中,display_errors通常设置为Off(这是一件好事,因为在生产站点中错误显示通常是不可取的!)
但是,在开发中,应该将其设置为On,以便显示错误。检查!
error_reporting(从PHP 5.3开始)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(意思是,除了通知、严格标准和弃用通知之外的所有内容都会显示)。当不确定时,将其设置为E_ALL以显示所有错误。检查!
哇哇!没有检查!我不能改变我的php.ini!
真遗憾。通常共享主机不允许更改它们的php.ini文件,因此,遗憾的是,这个选项是不可用的。但是不要害怕!我们还有其他选择!
运行时配置
在所需的脚本中,我们可以在运行时更改php.ini条目!这意味着,它将在脚本运行时运行!甜蜜的!
error_reporting(E_ALL);
ini_set("display_errors", "On");
这两行代码与上面修改php.ini条目的效果相同!太棒了!
我仍然得到一个空白页/500错误!
这意味着脚本甚至还没有运行!这通常发生在语法错误的时候!
由于语法错误,脚本甚至无法进入运行时。它在编译时失败,这意味着它将使用php.ini中的值,如果没有更改,可能不允许显示错误。
错误日志
此外,PHP在默认情况下会记录错误。在共享主机中,它可能位于专用文件夹中,也可能位于与该脚本相同的文件夹中。
如果您可以访问php.ini,您可以在error_log条目下找到它。
error_reporting(E_ALL | E_STRICT);
并在php.ini中打开显示错误
PHP错误处理
有时,您的应用程序不会按预期的方式运行,从而导致错误。有许多原因可能导致错误,例如:
The Web server might run out of disk space A user might have entered an invalid value in a form field The file or database record that you were trying to access may not exist The application might not have permission to write to a file on the disk A service that the application needs to access might be temporarily unavailable These types of errors are known as run-time errors, because they occur at the time the script runs. They are distinct from syntax errors that need to be fixed before the script will run.
专业的应用程序必须能够优雅地处理此类运行时错误。通常,这意味着要更清楚、更准确地告知用户问题。
理解错误级别
通常,当出现阻止脚本正常运行的问题时,PHP引擎会触发一个错误。每个错误都由一个整数值和一个相关常数表示。下表列出了一些常见的错误级别:
PHP引擎在遇到脚本问题时触发错误,但是您也可以自己触发错误,以生成更用户友好的错误消息。这样可以使应用程序更加复杂。下面介绍PHP中处理错误的一些常用方法:
基本错误处理使用die()函数
<?php // Try to open a non-existent file
$file = fopen("sample.txt", "r");
?>
如果文件不存在,你可能会得到这样的错误: 警告:fopen(sample.txt)[函数。在C:\wamp\www\project\test.php第2行中没有这样的文件或目录
如果我们遵循一些简单的步骤,我们可以防止用户得到这样的错误消息:
<?php
if(file_exists("sample.txt")){
$file = fopen("sample.txt", "r");
} else{
die("Error: The file you are trying to access doesn't exist.");
}
?>
现在如果你运行上面的脚本,你会得到这样的错误消息:错误:你试图访问的文件不存在。
正如您所看到的,通过在尝试访问文件之前实现一个简单的检查文件是否存在,我们可以生成一个对用户更有意义的错误消息。
上面使用的die()函数只是显示自定义错误消息,如果没有找到'sample.txt'文件,则终止当前脚本。
创建自定义错误处理程序
您可以创建自己的错误处理函数来处理PHP引擎生成的运行时错误。自定义错误处理程序为您提供了更大的灵活性和对错误的更好控制,它可以检查错误并决定如何处理错误,它可以向用户显示消息,将错误记录在文件或数据库中或通过电子邮件发送,尝试修复问题并继续执行,退出脚本执行或完全忽略错误。
自定义错误处理函数必须能够处理至少两个参数(errno和errstr),但是它可以选择接受额外的三个参数(errfile, errline和errcontext),如下所述:
下面是一个简单的自定义错误处理函数示例。这个处理程序customError()在发生错误时被触发,无论错误多么小。然后,它将错误的详细信息输出到浏览器,并停止脚本的执行。
<?php
// Error handler function
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
?>
您需要告诉PHP使用您的自定义错误处理函数—只需调用内置的set_error_handler()函数,并传入函数名。
<?php
// Error handler function
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
// Set error handler
set_error_handler("customError");
// Trigger error
echo($test);
?>
错误日志
在文本文件中记录错误消息
你也可以在日志文件中记录错误的详细信息,就像这样:
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "\r\n";
error_log($message, 3, "logs/app_errors.log");
die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>
触发错误
尽管PHP引擎在遇到脚本问题时会触发错误,但是您自己也可以触发错误。这有助于使您的应用程序更加健壮,因为它可以在潜在的问题变成严重错误之前标记出来。
要在你的脚本中触发一个错误,调用trigger_error()函数,传入你想要生成的错误消息:
trigger_error("There was a problem.");
考虑下面的函数,它计算两个数的除法。
<?php
function calcDivision($dividend, $divisor){
return($dividend / $divisor);
}
// Calling the function
echo calcDivision(10, 0);
?>
如果将一个0(0)值作为$除数参数传递,PHP引擎生成的错误将看起来像这样:警告:在C:\wamp\www\project\test.php第3行中除以0
这条消息看起来信息量不大。考虑以下示例,该示例使用trigger_error()函数生成错误。
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
// Calling the function
echo calcDivision(10, 0);
?>
现在,脚本在第4行生成以下错误消息:警告:在C:\wamp\www\project\error.php中,除数不能为零
正如您所看到的,与前一个示例相比,第二个示例生成的错误消息更清楚地解释了问题。
参考:https://www.tutorialrepublic.com/php-tutorial/php-error-handling.php
如果错误是在PHP代码中,您可以在代码中使用error_reporting()函数来设置为报告所有。
但是,这并不能处理PHP崩溃的情况。这方面的信息只能在服务器日志中找到。也许你无法访问这些,但我合作过的许多托管提供商都有某种方式让你访问它。例如,我最喜欢的方法是在.php所在的当前目录中创建error_log文件。尝试在那里搜索或联系您的主机提供商。