首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
定时任务里面如果有异常错误或退出 会被执行两次定时,并且如果在定时里面的添加的中断捕获,第二次报错时才能进入中断捕获
### 问题描述 在定时任务中抛出异常,会再次执行定时任务。抛出两次异常 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.6.2 php 7.3 ### 相关代码 ```php //第一次报错就能进入中断捕获 但是定时任务会被执行两次 use Swoole\Timer; ini_set('swoole.enable_coroutine', false); register_shutdown_function(function () { $error = error_get_last(); echo "进入中断捕获"; var_dump($error); // exit(); }); Timer::after(2000, function () { echo "执行定时\n"; throw new \Exception('exit'); }); \Swoole\Event::wait(); ``` ```php //如果在定时里面的添加中断捕获,第二次报错时才能进入中断捕获 use Swoole\Timer; ini_set('swoole.enable_coroutine', false); Timer::after(500, function () { register_shutdown_function(function () { $error = error_get_last(); echo "进入中断捕获"; var_dump($error); // exit(); }); Timer::after(2000, function () { echo "执行定时\n"; throw new \Exception('exit'); }); }); \Swoole\Event::wait(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 定时里面出现异常或退出后立即触发中断捕获,并且异常后不会执行两次。
发布于5年前 · 3 次浏览 · 来自
提问
云天001
### 问题描述 在定时任务中抛出异常,会再次执行定时任务。抛出两次异常 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.6.2 php 7.3 ### 相关代码 ```php //第一次报错就能进入中断捕获 但是定时任务会被执行两次 use Swoole\Timer; ini_set('swoole.enable_coroutine', false); register_shutdown_function(function () { $error = error_get_last(); echo "进入中断捕获"; var_dump($error); // exit(); }); Timer::after(2000, function () { echo "执行定时\n"; throw new \Exception('exit'); }); \Swoole\Event::wait(); ``` ```php //如果在定时里面的添加中断捕获,第二次报错时才能进入中断捕获 use Swoole\Timer; ini_set('swoole.enable_coroutine', false); Timer::after(500, function () { register_shutdown_function(function () { $error = error_get_last(); echo "进入中断捕获"; var_dump($error); // exit(); }); Timer::after(2000, function () { echo "执行定时\n"; throw new \Exception('exit'); }); }); \Swoole\Event::wait(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 定时里面出现异常或退出后立即触发中断捕获,并且异常后不会执行两次。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-03-24
鲁飞
你关闭了协程,在第一次的时候捕获到异常退出掉就可以。不关的时候也是一次。
赞
0
回复
2021-03-24
云天001
回复
鲁飞
你测试下我的第二段代码,如果是在定时里面设置的中断捕获, 需要在第二次抛异常时才会触发捕获,第一次抛异常不触发,这样会造成延时和重复执行。 或者用下面代码测试: ``` <?php use Swoole\Timer; ini_set('swoole.enable_coroutine', false); Timer::after(500, function () { register_shutdown_function(function () { $error = error_get_last(); echo "进入中断捕获"; var_dump($error); exit(); }); Timer::after(2000, function () { echo "执行定时\n"; //这里会被执行两遍!!!! exit(); }); }); \Swoole\Event::wait(); ```
赞
0
回复
2021-03-25
鲁飞
回复
云天001
你把协程打开- -
赞
0
回复
2021-04-04
MARiA
回复
云天001
我按照你的第二段代码测了没有发现执行两边的情况。要不发一下你的执行结果看看。
赞
0
回复
2021-04-19
云天001
回复
鲁飞
因为当前进程我用到了创建子进程,文档说在协程环境中无法使用 Process 模块,所以我特地关闭了协程-_-
赞
0
回复