(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模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class studen...
<?php /** * @throws Exception */ function curl() { throw new \Exception('err...
<?php //php7+ define('CONFIG', [ 'MYSQL' => '127.0.0.1',  ...
在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": { &...
php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...