代码如下:
$a = Coroutine::run(function() {
$obj = 'a';
defer(function() use (&$obj) {
// 这里会使用unset会直接把PHP都奔溃,使用$obj = null;则不会
// 这里主要是清理内存
unset($obj);
var_dump(Coroutine::getCurrent()->isAlive(), 'defer1', $obj);
sleep(1);
var_dump('defer1------');
});
sleep(10);
echo '111';
});
Coroutine::run(function() use ($a) {
$a->kill();
});
$time = microtime(true);
\Swow\Sync\waitAll();
sleep(2);
var_dump(microtime(true) - $time);
手动kill A协程后,defer函数执行了,发现如下情况
1,里面检测到协程是存活状态
2,var_dump('defer1------'); 这段没有执行
3,defer里面unset直接把php搞奔溃了
这种算不算bug??
这得问swow官方
去提交了https://github.com/swow/swow/issues/267
没复现
defer1--- 没输出
可能我是window环境下执行的
估计还是win下兼容性问题 看看作者怎么说吧
因为被kill掉了啊
正常不应该defer都兜底了,里面的代码应该都能执行完才对呀
使用usleep(1); 也一样的。一阻塞就不往下执行了
对的 我去问一下