代码常见的错误

  • 格式:pdf
  • 大小:253.33 KB
  • 文档页数:18
Ø 运行时错误 这种错误一般不会阻止 PHP 脚本的运行,但是会阻止脚本做希望它所 做的任何事情。例如,在调用 header()函数前如果有字符输出,PHP 通常会显示一条错误消息,虽然 PHP 脚本继续运行,但 header()函数 并没有执行成功。
Ø 逻辑错误 这种错误实际上是最麻烦的,不但不会阻止 PHP 脚本的执行,也不会 显示出错误消息。例如,在 if 语句中判断两个变量的值是否相等,如果 错把比较运行符号“==”写成赋值运行符号“=”就是一种逻辑错误,很 难会被发现。
;将会向 PHP 报告发生的每个错误 ;不显示满足上条指令所定义规则的所有错误报告 ;决定日志语句记录的位置
;设置每个日志项的最大长度 ;指定产生的错误报告写入的日志文件位置
</DIV>
PHP 的配置文件按上面的方式设置完成以后,并重新启动 Web 服务器。这样,在执行 PHP 的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的 错误日志/usr/local/error.log 中。此外,不仅可以记录满足 error_reporting 所定义规则的所有 错误,而且还可以使用 PHP 中的 error_log()函数,送出一个用户自定义的错误信息。该函数 的原型如下所示:
</DIV>
Ø 或者可以在 PHP 脚本中使用 error_reporting()函数,基于各个脚 本来调整这种行为。这个函数用于确定 PHP 应该在特定的页面内报告 哪些类型的错误。该函数获取一个数字或上表中错误级别常量作为参 数。如下所示:
<DIV align=center>
error_reporting(0); 设置为 0 会完全关闭错误报告
类似 E_ERROR,但不包括 PHP 核心造成的错误
E_CORE_WARNING
类似 E_WARNING,但不包括 PHP 核心错误警告
E_COMPILE_ERROR
致命的编译时错误
E_COMPILE_WARNING
致命的编译时警告
E_USER_ERROR
用户导致的错误消息
E_USER_WARNING
//报告除注意和警告之外的所
</DIV>
脚本 error.php 被修改以后并重新运行,在输出的结果中就只剩下一条错误报告了,如图 10-2 所示。
图 10-2 屏蔽“注意”和“警告”后的输出结果
除了使用 error_reporting 和 display_error 两个配置指令可以修改错误报告行为以外,还有许 多配置指令可以确定 PHP 的错误报告行为。其他的一些重要的指令如表 10-2 所示。
PHP 的错误和异常处理
任何程序员在开发时都可能遇到过一些失误,或其他原因造成错误的发 生。当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引 起一些错误发生。PHP 程序的错误发生一般归属于下列三个领域。 Ø 语法错误 语法错误最常见,并且最容易修复。例如,遗漏了一个分号,就会显示 错误信息。这类错误会阻止脚本执行。通常发生在程序开发时,可以通 过错误报告进行修复,再重新运行。
ini_set('display_errors',1);
出所有级别的错误报告*/
/*通过 error_reporting()函数设置在本脚本中
error_reporting(E_ALL);
并且可能不一定是一个问题 */
/*“注意(notice)”的报告,不会阻止脚本的
函数时提供的参数变量没有在之前声明
有被允许的错误报告。创建一个名为 error.php 的脚本文件,代码如下 所示:
<DIV align=center>
<html>
<head><title>测试错误报告</title></head>
<body>
<h2>测试错误报告</h2>
<?php
令开启如果有错误报告才能输出*/
/*开启 php.ini 中的 display_errors 指令,只
如果需要将程序中的错误报告写入错误日志中,只要在 PHP 的配置文件中,将配置指令 log_errors 开启即可。错误报告默认就会记录到 Web 服务器的日志文件里,例如记录到 Apache 服务器的错误日志文件 error.log 中。当然也可以记录错误日志到指定的文件中或发送给系统 syslog,分别介绍如下:
件,并设置 Web 服务器进程用户具有写的权限。然后在 PHP 的配置文件中,将 error_log 指令的值设置为这个错误日志文件的绝对路径。需要将 php.ini 中的配置指令做如下修改:
<DIV align=center>
error_reporting = E_ALL display_errors = Off log_errors = On log_errors_max_len = 1024 error_log = /usr/local/error.log
在上面的脚本中,为了确保配置文件中的 display_errors 指令开启, 通过 ini_set()函数强制在该脚本执行中启动,并通过 error_repoting() 函数设置错误级别为 E_ALL,报告所有错误、警告和注意。并在脚本 中分别创建出注意、警告和错误,PHP 脚本只有在遇到错误时才会终止 运行,输出的错误报告结果如图 10-1 所示。
表 10-2 确定 PHP 错误报告行为的配置指令
<DIV align=center>
配置指令


display_startup_errors
是否显示 PHP 引擎在初始化时遇到的所有错误
log_errors
确定日志语句记录的位置
error_log
设置错误可以发送到 syslog 中
log_errors_max_len
1.使用指定的文件记录错误报告日志
如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以 减少遭到攻击的可能。并且该文件一定要让 PHP 脚本的执行用户(Web 服务器进程所有者) 具有写权限。假设在 Linux 操作系统中,将/usr/local/目录下的 error.log 文件作为错误日志文
<DIV align=center>
; 可以抛出任何非注意的错误,默认值 error_reporting = E_ALL & ~E_NOTICE ; 只考虑致命的运行时错误、解析错误和核心错误 ; error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR ; 报告除用户导致的错误之外的所有错误 ; error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
getType($var);
会阻止脚本的执行 */
/*“警告(warning)”的报告,指示一个问题,
调用函数时没有提供必要的参数
getType();
再向下执行 */
/*“错误(error)”的报告,它会终止程序,脚
调用一个没有被定义的函数
get_Typeody>
</html>
</DIV>
当你正在开发站点时,你将希望 PHP 报告特定类型的错误,可以通过 调整错误报告的级别实现,可以通过以下两种方法设置错误报告级别。
Ø 可以通过在配置文件 php.ini 中,修改配置指令 error_reporting 的值,修改成功后重新启动 Web 服务器,则每个 PHP 脚本都可以按调
整后的错误级别输出错误报告。下面是修改 php.ini 配置文件的示例, 列出几种为 error_reporting 指令设置不同级别值的方式,可以把位运 算符[&(与)、|(或)、~(非)]和错误级别常量一起使用。如下 所示:
每个日志项的最大长度,以字节为单位,设置 0 表示指定最大长度
ignore_repeated_errors
是否忽略同一文件、同一行发生的重复错误消息
ignore_repeated_source
忽略不同文件中或同一文件中不同行上发生的重复错误
track_errors
启动该指令会使 PHP 在$php_errormsg 中存储最近发生的错误信息
error_reporting (E_ALL); 报告发生的每个错误
error_reporting (E_ALL & ~E_NOTICE);
//将会向 //可以抛出任何非注意的错误报
</DIV>
在下面的示例中,我们在 PHP 脚本中分别创建出一个“注意”、一个“警 告”和一个致命“错误”。并通过设置不同的错误级别,限制程序输出没
默认值 Off Off Null 1024 Off Off Off
</DIV>
10.1.2 错误日志
对于 PHP 开发者来说,一旦某个产品投入使用,应该立即将 display_errors 选项关闭,以免 因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个 产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢? 我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人 员或者管理人员查看系统是否存在问题。
用户导致的警告
E_USER_NOTICE
用户导致的注意消息
E_ALL
所有的错误、警告和注意
E_STRICT
关于 PHP 版本移植的兼容性和互操作性建议
</DIV>
如果用户希望在 PHP 脚本中,遇到上表中的某个级别的错误时,将错 误消息报告给用户。则必须在配置文件 php.ini 中,将 display_errors 指令的值设置为 On,开启 PHP 输出错误报告的功能。也可以在 PHP 脚本中调用 ini_set()函数,动态设置配置文件 php.ini 中的某个指令。 如果 display_errors 被启用,就会显示满足已设置的错误级别的所有 错误。当用户在访问时,看到显示的这些消息不仅会感到迷惑,而且还 可能会过多地泄露有关服务器的信息,使服务器变得很不安全。所以在 项目开发或测试期间启用此指令,可以根据不同的错误报告更好的调试 程序。出于安全性和美感的目的,让公众用户查看 PHP 的详细出错消 息一般是不明智的,所以在网站投入使用时要将其禁用。