(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 arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class studen...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....
PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...