(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(); 先在centos安装openssl,然后开始://生成私钥openssl genrsa -out rsa_private_key.pem 1024//生成公钥openssl rsa -in rsa_private_key.pem&...
<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...