当前位置:首页 > PHP > 正文内容

php event异常处理,php set_exception_handler无效

高老师6年前 (2020-03-29)PHP2049

(1).今天遇到一件奇怪的事情,在event事件中是无法自定义异常处理,例如我们使用set_exception_handler来统一处理异常。例如下面的代码:

<?php
error_reporting(E_ALL);
set_error_handler(function ($errno, $errStr, $errFile, $errLine){
    var_dump($errno, $errStr, $errFile, $errLine);
});
set_exception_handler(function ($exception){
    var_dump($exception->getMessage());
});


function aa()
{
    a();
}


//创建event配置.[空配置]
$eventConfig = new EventConfig(); 

//创建eventBase对象.event的所有基础类
$eventBase = new EventBase($eventConfig);

//创建event事件
$event = new Event($eventBase,-1,Event::TIMEOUT | Event::PERSIST,function(){
    echo 'date:'.date('Y-m-d H:i:s').PHP_EOL;
    aa();
});

//将创建的event事件扔到eventBase中,并设置超时时间为0.5秒
$event->add(2);

//让eventBase对象开始进入事件循环
$eventBase->loop();

我本来以为掉用不存在的a方法应该会触发set_exception_handler方法捕捉到。事实上上面的代码运行后不会报错,并且输出一次日期后就阻塞了。

(2).实际上event和swoole是一样的,运行以后会接管系统控制权,在其内部已经存在一个大的try catch,已经将异常捕获到了,捕获到异常的event还不打算退出进程,并且event扩展不继续把异常向上抛,这就导致了程序依然在阻塞,但是并不执行。我们来验证这件事情。例如我们是无法捕获整个event异常的

<?php
function aa()
{
    a();
}

try
{
    //创建event配置.[空配置]
    $eventConfig = new EventConfig();

    //创建eventBase对象.event的所有基础类
    $eventBase = new EventBase($eventConfig);

    //创建event事件
    $event = new Event($eventBase,-1,Event::TIMEOUT | Event::PERSIST,function(){
        echo 'date:'.date('Y-m-d H:i:s').PHP_EOL;
        aa();
    });

    //将创建的event事件扔到eventBase中,并设置超时时间为0.5秒
    $event->add(2);

    //让eventBase对象开始进入事件循环
    $eventBase->loop();
}
catch (Throwable $exception)
{
    var_dump($exception->getMessage());
}

(3).既然对event整体没有办法捕捉异常,那我们可以对其执行的代码做异常啊,毕竟是先实例化的event,例如下面的代码成功捕获异常

<?php
function aa()
{
    a();
}

//创建event配置.[空配置]
$eventConfig = new EventConfig();

//创建eventBase对象.event的所有基础类
$eventBase = new EventBase($eventConfig);

//创建event事件
$event = new Event($eventBase, -1, Event::TIMEOUT | Event::PERSIST, function () {
    echo 'date:' . date('Y-m-d H:i:s') . PHP_EOL;
    try
    {
        aa();
    }
    catch (Throwable $exception)
    {
        var_dump($exception->getMessage());
    }
});

//将创建的event事件扔到eventBase中,并设置超时时间为0.5秒
$event->add(2);

//让eventBase对象开始进入事件循环
$eventBase->loop();

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/129.html

分享给朋友:

“php event异常处理,php set_exception_handler无效” 的相关文章

php调用 java webservice接口

php调用 java webservice接口

php调用Webservice基本语法如下:$url ='xxxxxxx.cn'  //链接服务器端 $client = new SoapClient($url);通过以上语法已经连接到webservice,也可将wsdl在本地使用,...

 php mysql 行锁,php mysql 行级锁,php mysql 行锁定

php mysql 行锁,php mysql 行级锁,php mysql 行锁定

应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...

php数组合并 array_merge和+号的区别

php数组合并 array_merge和+号的区别

array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

php arrayaccess的应用场景:配置管理器

php arrayaccess的应用场景:配置管理器

上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...

tp orm事务提交未执行的教训和总结

tp orm事务提交未执行的教训和总结

最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...