图源:
在之前的笔记中介绍位运算时,提过error_reporting
函数。事实上在使用php开发项目时,常需要使用相关的错误处理函数来设置环境,以让不同的环境对错误能进行不同的处理。
E_NOTICE
和E_DEPCATED
等错误可以直接关闭。
完整的错误级别见官方手册。
错误相关设置属于系统基本环境设置的一环,一般会在入口文件加载的相关配置信息处理的脚本中执行,这里给出我编写的一个错误处理示例:
<?php
enum Environment
{
case PRODUCT; //生产环境
case DEVELOP; //开发环境
case PRE_PRODUCT; //预生产环境
}
$configs = array(
'env' => Environment::PRODUCT,
);
function write_log(string $msg): void
{
$fopen = fopen("sys.log", "a");
$msg = date("Y-m-d H:i:s") . ": " . $msg . "\n";
fwrite($fopen, $msg);
fclose($fopen);
}
if ($configs['env'] === Environment::DEVELOP) {
error_reporting(E_ALL);
ini_set("display_errors", "1");
function exp_handle($exp)
{
if ($exp instanceof Error) {
echo $exp->error() . PHP_EOL;
} elseif ($exp instanceof Exception) {
echo $exp->getMessage() . PHP_EOL;
} else {
var_export($exp);
}
}
} elseif ($configs['env'] === Environment::PRE_PRODUCT || $configs['env'] === Environment::PRODUCT) {
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
ini_set("display_errors", "stderr");
function exp_handle($exp)
{
if ($exp instanceof Error) {
write_log($exp->error());
} elseif ($exp instanceof Exception) {
write_log($exp->getMessage());
} else {
write_log(var_export($exp, true));
}
}
} else {;
}
set_exception_handler("exp_handle");
其中使用一个配置变量$configs['env']
来区分不同的环境,使用error_reporting
分别设置开发环境和生产环境的错误级别,用int_set
设置display
环境变量,在开发环境错误信息可以正常输出到控制台,而生产环境都输出到标准错误流stderr
。函数exp_handle
充当一个默认的异常捕获器(从php7开始,php的大部分错误都以抛出一个Error
类别的p异常表示),可以捕获未捕获的异常,开发环境直接输出异常相关信息,生产环境将其输出的日志文件。
可以进行一些简单测试:
<?php
require_once './index.php';
fopen("not_exist.txt","r");
<?php
require_once './index.php';
throw new Exception('Uncaught Exception');
echo "Not Executed\n";
这两个示例在$configs['env']
设置为开发环境或生产环境时会有不同的表现。
更多的错误相关信息见官方手册。
文章评论