错误的触发
正常触发:
程序运行时确实发生了运行时错误——也可能是语法检查错误。
3种常见的运行时错误:
人工触发
就是由程序员通过程序代码而“产生”一个错误。
语法:
trigger_error(“错误提示” , 用户错误代号);
应用中,通常是需要检测(判断)数据的有效性,以决定是否触发相应错误,比如:
错误的显示控制
网页中显示(提示)错误信息,是可以进行控制的,有2种途径:
1,在php.ini文件中设定,对所有php程序都有效;
2,在当前脚本文件中,只对当前脚步文件有效。
错误的显示有2个方面可以进行控制;
1,设定是否显示:display_error:
php.ini中;display_error = On; //表示显示, Off表示不显示;
(显示)
(不显示)
脚本中: ini_set(“display_error”, 1); //1表示显示, 0表示不显示,也可以用true,false
脚本中的设定优先级高。
2,设定显示哪些级别的错误——依赖与第一项设定为显示的情况。
php.ini文件中:
error_reporting = E_NOTICE; //只显示E_NOTICE错误
error_reporting = E_NOTICE | E_WARNING; //显示E_NOTICE和E_WARNING错误
error_reporting = E_NOTICE | E_WARNING | E_USER_ERROR;
//显示E_NOTICE和E_WARNING和E_USER_ERROR错误
解释上一行::
E_NOTICE: 00000000 00001000
E_WARNING: 00000000 00000010
E_USER_ERROR: 00000001 00000000
或运算(|)
00000001 00001010
实际上,在开发阶段,常用的是:
error_reporting = E_ALL | E_STRICT;
它是这样的结果:
E_ALL 01110111 11111111
E_STRICT: 00001000 00000000
或运算(|)
01111111 11111111
可见,E_ALL并非真的表示“所有”,而是只有E_ALL | E_STRICT才真的表示所有。
继续:如果在显示“所有”错误的基础上,只想“关闭”个别少数错误呢?
跟状态数据的设定(关闭)道理一样,只要这么做:
error_reporting = E_ALL | E_STRICT & ~E_NOTICE; //只关闭了E_NOTICE错误提示
error_reporting = E_ALL | E_STRICT & ~E_NOTICE & ~E_WARNING;//关闭了2个
在代码中设定:
ini_set(“error_reporting”, E_NOTICE); //只显示E_NOTICE错误
ini_set(“error_reporting”, E_NOTICE | E_WARNING); 显示E_NOTICE和E_WARNING错误
ini_set(“error_reporting”, E_ALL | E_STRICT & ~E_NOTICE); //只关闭E_NOTICE错误
ini_set()含义可以设定几乎所有php.ini中的设定项,形式如下:
ini_set(“设定项名称” ,值); //这种设定都只对当前脚本有效,而且无需重启apache,很方便。
另一个对应函数是:ini_get(“设定项名称”);//用于获取某项的值。
记录错误日志
在开发阶段,我们通常都是显示所有错误——意图解决错误
在产品阶段,我们通常都是隐藏所有错误——并同时将错误信息记录到文件中——错误日志文件。
我们可以自己查看错误日志以解决开发阶段没有发现的错误问题。
记录错误日志同样有2种途径:
1,在Php.ini文件中设定:
log_errors = On; //用于设定是否记录错误日志,On记录,Off不记录
error_log = “错误日志文件名”; //设定错误日志的文件名
此时,该文件没有给定路径,则系统会在每个文件夹下建立该文件并记录进去。
文件上传
文件操作
一 、解析路径:
1 获得文件名:
basename();
给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。如果文件名是以 suffix 结束的,那这一部分也会被去掉。
eg:
$path = "/home/httpd/html/index.php";
$file = basename($path,".php"); // $file is set to "index"
2 得到目录部分:
dirname();
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
eg:
$path = "/etc/passwd";
$file = dirname($path); // $file is set to "/etc"
3 得到路径关联数组
pathinfo();
得到一个指定路径中的三个部分:目录名,基本名,扩展名。
eg:
$pathinfo = pathinfo("www/test/index.html");
var_dump($pathinfo);
// $path['dirname']
$path['basename']
$path['extenssion']
二、文件类型
1. filetype();
返回文件的类型。可能的值有 fifo,char,dir,block,link,file 和 unknown。
eg:
echo filetype('/etc/passwd'); // file
echo filetype('/etc/'); // dir
三、得到给定文件有用信息数组(很有用)
1. fstat();
通过已打开的文件指针取得文件信息
获取由文件指针 handle 所打开文件的统计信息。本函数和 stat() 函数相似,除了它是作用于已打开的文件指针而不是文件名。
eg:
// 打开文件
$fp = fopen("/etc/passwd", "r");
// 取得统计信息
$fstat = fstat($fp);
// 关闭文件
fclose($fp);
// 只显示关联数组部分
print_r(array_slice($fstat, 13));
2. stat()
获取由 filename 指定的文件的统计信息(类比fstat())
四、计算大小
1. filesize()
返回文件大小的字节数,如果出错返回 FALSE 并生成一条 E_WARNING 级的错误。
eg:
// 输出类似:somefile.txt: 1024 bytes
$filename = 'somefile.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
2. disk_free_space()
获得目录所在磁盘分区的可用空间(字节单位)
eg
// $df 包含根目录下可用的字节数
$df = disk_free_space("/");
//在 Windows 下:
disk_free_space("C:");
disk_free_space("D:");
3. disk_total_space()
返回一个目录的磁盘总大小
eg:(同上,换掉函数)
另:如需要计算一个目录大小,可以编写一个递归函数来实现
function dir_size($dir){
$dir_size = 0;
if($dh = @opendir($dir)){
while(($filename = readdir($dh)) != false){
if($filename !='.' and $filename !='..'){
if(is_file($dir.'/'.$filename)){
$dir_size +=filesize($dir.'/'.$filename);
}else if(is_dir($dir.'/'.$filename)){
$dir_size +=dir_size($dir.'/'.$filename);
}
}
}#end while
}# end opendir
@closedir($dh);
return $dir_size;
} #end function