PHP 5 添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw 语句抛出并被 catch语句捕获。需要进行异常处理的代码都必须放入 try代码块内,以便捕获可能存在的异常。每一个 try至少要有一个与之对应的 catch。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch代码块内再次抛出(throw)异常。
当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
抛出一个异常
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
echo 'Hello World';
/* 输出的内容
0.2
Caught exception: Division by zero.
Hello World
*/
?>
嵌套的异常
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* rethrow it */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
/*输出:
string(4) "foo!"
*/
?>
common.php
<?php
ini_set('error_reporting',E_ALL&~E_WARING);
error_reporting(E_ALL&~E_WARNING);
//生产环境中为 0
?>
try.php
<?php
try{
$fp=fopen('a.txt','r');
if(!$fp){
throw new Exception('文件打开失败');
}
echo '后续代码均不执行';
//exception $e $e=new Exception
}catch(Exception $e){
echo $e->getMessage();
echo '<br>是不是进入到这一段来执行了';
}
?>
时间和错误
概念:
Unix时间戳 1970.1.1 到现在秒数 最大值为2038年的1月19日
通过time()函数能够得到unix时间戳
Date(‘时间格式’[,’unix时间戳’]); 如果你不传第二个参数的时候,默认为系统当前时间。
在中国大陆地区,常用时间格式的参数 Y 年 m 两位的月数字表示 d 两位的日 数字表示 H 小时 i 分 s 秒
有其它格式,但是其它格式暂时用不到,你需要的是了解还有其它的。
//1,直接修改php.ini当中的值
//这种方式不推荐使用。
//2,date_default_timezone_set();用上这个函数
Sleep休眠指定秒数
Usleep休眠指定微秒数
错误异常处理
1, 开发时 让程序人员看到对应的错误
在开发时,我将错误打开。Php.ini当中,错误是默认打开的
2, 运营时 让用户看不到错误提示,但是运维人员能够看到或者收到错误提示
我将错误显示关闭掉
提示类型:
1,error 错误 如果发现错误,程序崩溃,停止执行
2, warning警告如果警告,给出提示,会影响到逻辑
3,notice 提醒 看着不爽,效率有些影响【在项目中,连提示都不要有】
如何让用户看不见:
1,@ 屏蔽所在行的错误,提示和警告
2,php.ini 设置display_error on将这个值改为off
3,是设置php.ini当中的error_reporting E_ALL &~ E_NOTICE
@符,每行都要使用,看得很不爽,孔子曰:“不爽哉”
在真实项目当中,连notice提示都不要有。
现在的情况是,运营人员并没有把错误记录下来,运维人员也看不到。想办法处理。
1,采用日志的方式来存储 大网站有专门的日志记录服务器,来记录日志
Log_error 将其on 开启
Error_log有三种表示方式:
1, 存储到apache的错误日志中 实现方式,直接留空
2, 将日志存储到系统日志中
3, 是将日志存储到用户自定义的文件中
第一, 必须要改php.ini才能生效
第二, 必须要重启
第三, 服务器当中可能有多个网站,多个网站可能会同时生效。
Ini_set(); 针对当前访问的文件生效php.ini设置,不需要重启,直接设置直接生效,对其他无影响。
与ini_set(‘error_reporting’,值); 有一个等价的函数 error_reporting();
Ini_get() 直接写上对应的参数就可以,能够获取参数的值
@效率很低
time.php
<?php
//1,直接修改php.ini当中的值
//
// 这种方式不推荐使用。
//
//2,date_default_timezone_set();用上这个函数
//
//
//3, 在unix时间戳上面+ 8个小时的秒数 $time=time()+(60*60*8); 很2的方式,每次都要加。烦,因此,不使用它
// 改时区共分三种形式:
//
// 1,直接写 洲别/城市
// 2, 直接写简称 PRC
// 3,Etc/GMT+8
echo date('Y-m-d H:i:s',filectime('d:/web/1.php'));
date_default_timezone_set('Etc/GMT-8');
echo '北京时间'.date('Y年m月d号 H点i分s秒',time()-(60*60*24)).'<br>';
date_default_timezone_set('America/New_York');
echo '纽约时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Asia/Seoul');
echo '韩国时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Europe/Paris');
echo '巴黎时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Europe/Berlin');
echo '德国时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Europe/London');
echo '伦敦时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Australia/Sydney');
echo '悉尼时间'.date('Y年m月d号 H点i分s秒').'<br>';
date_default_timezone_set('Africa/Kampala');
echo '南非时间'.date('Y年m月d号 H点i分s秒').'<br>';
$t=mktime(22,0,0,7,8,1983);
echo date('Y-m-d H:i:s',$t);
$bir=mktime(22,0,0,7,8,1983);
$s=time()-$bir;
//date();
?>
checkdate.php
<?php
if(checkdate(29,2,2011)){
echo '正确';
}else{
echo '错误';
}
?>
time.php
<?php
$t=getdate();
var_dump($t);
$t=strtotime('-1 year');
echo date('Y-m-d H:i:s',$t);
//phpinfo();
//开始时间
$start=microtime(true);
for($i=0;$i<1000;$i++){
time();
//$_SERVER["REQUEST_TIME"];
}
//代表在执行
//
//
//sleep(1);
//结束时间
$end=microtime(true);
echo '页面执行时间为'.($end-$start);
?>