在swoole中,由于多个协程是并发执行的,因此不能使用类静态变量/全局变量保存协程上下文内容。使用局部变量是安全的,因为局部变量的值会自动保存在协程栈中,其他协程访问不到协程的局部变量。
在原生 swoole 中使用协程上下文管理
Co\run(function(){
$cid = Co::getCid(); // 得到当前协程id
$context = Co::getContext($cid=null); 不传递 $cid,默认是当前协程id
// 保存属性到 协程上下文 Context 中
$context["a"] = 1;
$context["b"] = 2;
// 在子协程中获取 示例
go(function(){
$cid = Co::getPcid(); // 获取父协程id
$context = Co::getContext($cid); // 得到 父协程中的 $context 变量
});
// 在父协程的另外一个作用域获取案例
function test():string{
$cid = Co::getCid();
$data = Co::getContext($cid);
var_dump($data);
return time()." -> 111\n";
}
});
Easyswoole 协程上下文管理
// 当前父协程中设置属性
\EasySwoole\Component\Context\ContextManager::getInstance()->set("a",new \stdClass(),$cid=null);
\EasySwoole\Component\Context\ContextManager::getInstance()->set("b",1,$cid=null);
go(function(){
// 可以在子协程中获取
var_dump(\EasySwoole\Component\Context\ContextManager::getInstance()->get("a",$cid=null));
});
// 同理也可以在 协程其他作用域中获取
网友评论