協程單例
為兼容協程環境下的單例模式安全 可以使用CoroutineSingleTon這個trait
引用方法可以參考普通Singleton trait
namespace EasySwoole\Component;
use Swoole\Coroutine;
trait CoroutineSingleTon
{
private static $instance = [];
static function getInstance(...$args)
{
$cid = Coroutine::getCid();
if(!isset(self::$instance[$cid])){
self::$instance[$cid] = new static(...$args);
/*
* 兼容非攜程環境
*/
if($cid > 0){
Coroutine::defer(function ()use($cid){
unset(self::$instance[$cid]);
});
}
}
return self::$instance[$cid];
}
function destroy(int $cid = null)
{
if($cid === null){
$cid = Coroutine::getCid();
}
unset(self::$instance[$cid]);
}
}