(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(); PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () { posix_kill(0, SIGTERM); });...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...
在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning: ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
<?php //如果支持exec函数,可以使用的方式 exec('chcp 65001'); //如果exec函数因安全问题禁用,可以使用的方式 pclose(popen('chcp 65001', 'r'));...