(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();
//$ak开发密钥,$cityname城市名称(支持省县乡详细地址) public function getposition($ak,$cityname){ $callback=array('lng'=>0,'l...
php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/* * 获取当前PHP文件名称 */ if (!function_exists('phpself...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int { &nb...
PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...