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

php event异常处理,php set_exception_handler无效

高老师7年前 (2020-03-29)PHP2216

(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批量插入的2种方法速度对比

PHP批量插入的2种方法速度对比

代码1:for循环批量插入100W数据<?php set_time_limit(0); $servername = "localhost"; $username = "root"; $password ...

 php max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

编写php com组件,php调用.net dll,php源码保护

编写php com组件,php调用.net dll,php源码保护

开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...

Thinkphp Call Stack,PHP调用栈Call Stack的获取

Thinkphp Call Stack,PHP调用栈Call Stack的获取

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...

全方位认识PHP的SESSION

全方位认识PHP的SESSION

【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...