首页 > 后端开发 > 正文

php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些

2023-09-25 17:52:28 | 我爱编程网

今天我爱编程网小编整理了php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些相关内容,希望能帮助到大家,一起来看下吧。

php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些

php拦截异常怎么写


php拦截异常可以通过PHP的错误、异常机制及其内建数'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 来写。

'set_exception_handler' 函数 用于拦截各种未捕获的异常,然后将这些交给用户自定义的方式进行处理

'set_error_handler' 函数可以拦截各种错误,然后交给用户自定义的方式进行处理 (推荐学习:PHP视频教程)
'register_shutdown_function' 函数是在PHP脚本结束时调用的函数,配合'error_get_last'可以获取最后的致命性错误

这个思路大体就是把错误、异常、致命性错误拦截下来,交给我们自定义的方法进行处理,我们辨别这些错误、异常是否致命,如果是则记录的数据库或者文件系统,然后使用脚本不停的扫描这些日志,发现严重错误立即发送邮件或发送短信进行报警

首先我们定义错误拦截类,该类用于将错误、异常拦截下来,用我们自己定义的处理方式进行处理,该类放在文件名为'errorHandler.class.php'中,代码如下
/**
* 文件名称:baseErrorHandler.class.php
* 摘 要:错误拦截器父类
*/
require 'errorHandlerException.class.php';//异常类
class errorHandler
{
public $argvs = array();
public $memoryReserveSize = 262144;//备用内存大小
private $_memoryReserve;//备用内存
/**
* 方 法:注册自定义错误、异常拦截器
* 参 数:void
* 返 回:void
*/
public function register()
{
ini_set('display_errors', 0);
set_exception_handler(array($this, 'handleException'));//截获未捕获的异常
set_error_handler(array($this, 'handleError'));//截获各种错误 此处切不可掉换位置
//留下备用内存 供后面拦截致命错误使用
$this->memoryReserveSize > 0 && $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
register_shutdown_function(array($this, 'handleFatalError'));//截获致命性错误
}
/**
* 方 法:取消自定义错误、异常拦截器
* 参 数:void
* 返 回:void
*/
public function unregister()
{
restore_error_handler();
restore_exception_handler();
}
/**
* 方 法:处理截获的未捕获的异常
* 参 数:Exception $exception
* 返 回:void
*/
public function handleException($exception)
{
$this->unregister();
try
{
$this->logException($exception);
exit(1);
}
catch(Exception $e)
{
exit(1);
}
}
/**
* 方 法:处理截获的错误
* 参 数:int $code 错误代码
* 参 数:string $message 错误信息
* 参 数:string $file 错误文件
* 参 数:int $line 错误的行数
* 返 回:boolean
*/
public function handleError($code, $message, $file, $line)
{
//该处思想是将错误变成异常抛出 统一交给异常处理函数进行处理
if((error_reporting() & $code) && !in_array($code, array(E_NOTICE, E_WARNING, E_USER_NOTICE, E_USER_WARNING, E_DEPRECATED)))
{//此处只记录严重的错误 对于各种WARNING NOTICE不作处理
$exception = new errorHandlerException($message, $code, $code, $file, $line);
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_shift($trace);//trace的第一个元素为当前对象 移除
foreach($trace as $frame)
{
if($frame['function'] == '__toString')
{//如果错误出现在 __toString 方法中 不抛出任何异常
$this->handleException($exception);
exit(1);
}
}
throw $exception;
}
return false;
}
/**
* 方 法:截获致命性错误
* 参 数:void
* 返 回:void
*/
public function handleFatalError()
{
unset($this->_memoryReserve);//释放内存供下面处理程序使用
$error = error_get_last();//最后一条错误信息
if(errorHandlerException::isFatalError($error))
{//如果是致命错误进行处理
$exception = new errorHandlerException($error['message'], $error['type'], $error['type'], $error['file'], $error['line']);
$this->logException($exception);
exit(1);
}
}
/**
* 方 法:获取服务器IP
* 参 数:void
* 返 回:string
*/
final public function getServerIp()
{
$serverIp = '';
if(isset($_SERVER['SERVER_ADDR']))
{
$serverIp = $_SERVER['SERVER_ADDR'];
}
elseif(isset($_SERVER['LOCAL_ADDR']))
{
$serverIp = $_SERVER['LOCAL_ADDR'];
}
elseif(isset($_SERVER['HOSTNAME']))
{
$serverIp = gethostbyname($_SERVER['HOSTNAME']);
}
else
{
$serverIp = getenv('SERVER_ADDR');
}
return $serverIp;
}
/**
* 方 法:获取当前URI信息
* 参 数:void
* 返 回:string $url
*/
public function getCurrentUri()
{
$uri = '';
if($_SERVER ["REMOTE_ADDR"])
{//浏览器浏览模式
$uri = '' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
}
else
{//命令行模式
$params = $this->argvs;
$uri = $params[0];
array_shift($params);
for($i = 0, $len = count($params); $i < $len; $i++)
{
$uri .= ' ' . $params[$i];
}
}
return $uri;
}
/**
* 方 法:记录异常信息
* 参 数:errorHandlerException $e 错误异常
* 返 回:boolean 是否保存成功
*/
final public function logException($e)
{
$error = array(
'add_time' => time(),
'title' => errorHandlerException::getName($e->getCode()),//这里获取用户友好型名称
'message' => array(),
'server_ip' => $this->getServerIp(),
'code' => errorHandlerException::getLocalCode($e->getCode()),//这里为各种错误定义一个编号以便查找
'file' => $e->getFile(),
'line' => $e->getLine(),
'url' => $this->getCurrentUri(),
);
do
{
//$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')'
$message = (string)$e;
$error['message'][] = $message;
} while($e = $e->getPrevious());
$error['message'] = implode("
", $error['message']);
$this->logError($error);
}
/**
* 方 法:记录异常信息
* 参 数:array $error = array(
* 'time' => int,
* 'title' => 'string',
* 'message' => 'string',
* 'code' => int,
* 'server_ip' => 'string'
* 'file' => 'string',
* 'line' => int,
* 'url' => 'string',
* );
* 返 回:boolean 是否保存成功
*/
public function logError($error)
{
/*这里去实现如何将错误信息记录到日志*/
}
}上述代码中,有个'errorHandlerException'类,该类放在文件'errorHandlerException.class.php'中,该类用于将错误转换为异常,以便记录错误发生的文件、行号、错误代码、错误信息等信息,同时其方法'isFatalError'用于辨别该错误是否是致命性错误。

php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些我爱编程网

php能不能像java那样打印错误堆栈信息到错误日志

PHP 确实不会输出错误堆栈,但通过函数,还是能够获取到错误堆栈的。
function getBacktrace() {
ob_start();
debug_print_backtrace();
return ob_get_clean();
}

调用上面这个函数取得错误堆栈,再用 file_put_contents('log_path', FILE_APPEND); 写入日志文件即可。
还有一个办法:为 PHP 安装 xdebug 扩展
windows 下的安装方法 安装好后,修改 php.ini

php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些

PHP网站打开空白的常见解决方法有哪些

在php编程中出现空白页面可能是由以下几个原因造成的:
1、逻辑错误
逻辑错误是最难排除的,从表面上看,也许代码是合法的,是正规的,可运行起来却不是预料之中的。为什么呢?也许是编写者想得不够全面,毕竟人是人,计算机是计算机,计算机不可能完全按照人的思路去运行脚本。在这里,我告诉大家一个比较好的调试方法,就是使用注释符“/* */”,注释掉一些代码,观察运行情况。要想完全排除逻辑错误,没有耐心是不行的,所以要静下心来,不要着急。
2、行为未定义
看下面的代码:
<?php
$action = $_GET['id'];
if($action == '')
$action = 1;
if($action == 1) {
echo("/$action's value is 1");
} else if($action == 2) {
echo("/$action's value is 2");
}
?>
这段代码大家看得很明白,就是如果$action变量为空时将它设为1,然后判断$action变量的值而做出不同的事件。当然,假如$action既不等于1,也不等于2的时候,PHP会做什么呢??——什么也不会做,所以就会产生了空白的页面。知道了原因,解决就容易了。关于这个问题的解决,很简单,在 if模块后加一个else就可以了,打印一些信息即可。
3、语法错误
大家可能会问了,如果出现语法错误,一般会有错误提示的,怎么会空白呢?当然,这只是一些个别现象,在某些主页空间中(比如中国聚网的免费空间),如果你写得PHP有语法错误,它也不会有任何提示。解决也很容易,在上传文件之前在本地测试,找出错误的代码进行改正。( www.3lian.com )
4、滥用错误屏蔽符@
错误抑制符“@”常常用于可能会发生错误的地方,但是抑制符使用过多或使用得不是时候,也可能导致空白也免得出现,来看看下面两个PHP脚本吧:
test1.php
<?php
@include("test2.php");
echo($var);
?>
test2.php
<?php
$var = "Hi" //这行代码有错误,没有分号
$var1 = "Hello" //同上
?>
运行test1看看,结果就产生了空白的页面。纠正也很简单,可以去掉include函数前面的抑制符,或者更正test2.php文件中的错误。

以上就是php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些全部内容,更多相关信息,敬请关注我爱编程网。
与“php没有堆栈框架的异常 PHP网站打开空白的常见解决方法有哪些”相关推荐
php没有堆浅框架的异常 正确理解PHP程序编译时的错误信息
php没有堆浅框架的异常 正确理解PHP程序编译时的错误信息

正确理解PHP程序编译时的错误信息我们编写程序时无论怎样小心谨慎犯错总是在所难免的这些错误通常会迷惑PHP编译器如果开发人员无法了解编译器报错信息的含义那么这些错误信息不仅毫无用处还会常常让人感到沮丧编译PHP脚本时PHP编译器会尽其所能报告它遇到的第一个问题这样就产生一个问题只有当错误出现时PHP才能将它识别出来(本文后面对此问题进行了详细描述)正是由于这个缘故编译器指出出错的那行

2023-10-03 19:10:43
php清空框架 php中有没有清空$_POST或$_GET的方法
php清空框架 php中有没有清空$_POST或$_GET的方法

PHPCI框架怎么除去缓存config.php里有设置session更新的时间的,默认是5分钟$config['sess_time_to_update']=300;写hook,或是其它触发条件自动删除缓存文件,反正就是要自己删除啦.php如何清空文本框&lt;form&gt;&lt;inputtype="text"&gt;&lt;inputtype="reset"value="

2023-09-01 05:05:52
php空白框架 php开发常用框架有哪几个
php空白框架 php开发常用框架有哪几个

php需要掌握几个框架PHP常用框架对比一、CI框架CI框架是一个简单快速的PHPMVC轻量级框架,它执行效率高,快速简洁,代码量少,适合中小型项目开发,也可以做大型项目,但扩展能力不是很好。优势:框架比较简单,适合入门开发,易学,上手快,静态化很容易,文档比较详细。缺点:由于框架较小,所以功能不完全,比如使用mongoDB就要自己实现接口,对数据库的操作不够安全(写入操

2023-09-03 10:53:19
简述常见的php常见框架 PHP有哪些流行的框架
简述常见的php常见框架 PHP有哪些流行的框架

php主流框架都有什么php各种主流框架的比较一、ThinkPHP框架优势:简单易用(Model,Controller,View负责各自的工作),它拥有支持XML标签库技术的编译型模版引擎,支持两种模版标签,动态编译,缓存技术。还支持自定义标签库,具有独特的数据验证和自动填充,MD5数据加密等功能。部署简单只需要一个入口文件,上手快,有丰富的中文文档;学习成本低,社区活跃度高,在

2023-09-24 21:48:22
php框架常量对照表 php常量的定义方法有哪些
php框架常量对照表 php常量的定义方法有哪些

php常量的定义方法有哪些php常量的定义方法有哪些常量特点:不能修改,不能销毁,不能删除,声明常量后,该常量可以在页面的任意处使用声明常量的方法:const、define、static命名规范:和变量一样,但是全部大写define:define是函数,不能在对象中定义,但可在类中定义使用;define('CL',10);echoCL;//判断常量是否存在

2023-09-27 17:14:14
常见的php后端框架 php有哪些框架?
常见的php后端框架 php有哪些框架?

php主流框架都有什么php各种主流框架的比较一、ThinkPHP框架优势:简单易用(Model,Controller,View负责各自的工作),它拥有支持XML标签库技术的编译型模版引擎,支持两种模版标签,动态编译,缓存技术。还支持自定义标签库,具有独特的数据验证和自动填充,MD5数据加密等功能。部署简单只需要一个入口文件,上手快,有丰富的中文文档;学习成本低,社区活跃度高,在

2023-09-19 07:13:05
php的常见的框架 PHP有哪些流行的框架
php的常见的框架 PHP有哪些流行的框架

PHP有哪些流行的框架PHP有哪些流行的框架?PHP有哪些流行的框架?PHP作为一种十分流行的编程语言,拥有大量的应用领域和开源程序库。其中,PHP框架可以有效提高对PHP语言的理解和运用水平。框架作为一种用于开发网络应用程序的基础架构,可以让开发者在不同项目的开发中提高效率。在PHP框架领域中,有许多众所周知、使用广泛的优秀框架,其中一些常见的PHP框架如下:1.Lara

2023-09-20 08:22:56
Php框架常见路由设计 php框架搭建方法?
Php框架常见路由设计 php框架搭建方法?

php如何实现页面路由转发php实现页面路由转发的方法:首先配置nginx服务器,在【.htaccess】中写上nginx的语法;然后打开根目录的【index.php】,编写文件路由即可。php实现页面路由转发的方法:1、配置nginx服务器nginx服务器不会自动读取.htaccess,也不支持.htaccess语法,这里需要做一个投机取巧的方法:在.htaccess中写上n

2023-09-21 07:07:26