functionchange(&$var){
$var+=10;
}
$var=1;
change(++$var);
// E_STRICT
E_RECOVERABLE_ERROR
这个级别其实是ERROR级别的,但是它是期望被捕获的,如果没有被错误处理捕获,表现和E_ERROR是一样的。
经常出现在形参定义了类型,但调用的时候传入了错误类型。它的错误提醒也比E_ERROR的fatal error前面多了一个Catachable的字样。
//Catchable fatal error: Argument 1 passed to testCall() must be an instance of A, instance of B given, called in /tmp/php/index.php on line 37 and defined in /tmp/php/index.php on line 33
classA{
}
classB{
}
functiontestCall(A$a){
}
$b=newB();
testCall($b);
E_DEPRECATED
这个错误表示你用了一个旧版本的函数当前页面的脚本发生错误,而这个函数后期版本可能被禁用或者不维护了。
比如curl的CURLOPT_POSTFIELDS使用@FILENAME来上传文件的方法
// Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /tmp/php/index.php on line 42
$ch=curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch,CURLOPT_POSTFIELDS,array('fileupload'=>'@'."test"));
E_CORE_ERROR, E_CORE_WARNING
这两个错误是由PHP的引擎产生的,在PHP初始化过程中发生。
E_COMPILE_ERROR, E_COMPILE_WARNING
这两个错误是由PHP引擎产生的,在编译过程中发生。
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
这些错误都是用户制造的,使用trigger_error,这里就相当于一个口子给用户触发出各种错误类型。这个是一个很好逃避try catch异常的方式。
trigger_error("Cannot divide by zero",E_USER_ERROR);
// E_USER_ERROR
// E_USER_WARING
// E_USER_NOTICE
// E_USER_DEPRECATED
E_ALL
E_STRICT出外的所有错误和警告信息。
错误控制
php中有很多配置和参数是可以控制错误,以及错误的日志显示的。第一步,我们需要了解的是php中的有关错误的配置有哪些?
我们按照php+php-fpm的模型来说,会影响php错误显示的其实是有两个配置文件,一个是php本身的配置文件php.ini,另外一个是php-fpm的配置文件,php-fpm.conf。
php.ini中的配置
error_reporting=E_ALL// 报告错误级别,什么级别的
error_log= /tmp/php_errors.log// php中的错误显示的日志位置