Context.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace think\swoole\coroutine;
  3. use ArrayObject;
  4. use Closure;
  5. use Swoole\Coroutine;
  6. class Context
  7. {
  8. /**
  9. * 获取协程上下文
  10. * @param null $cid
  11. * @return Coroutine\Context
  12. */
  13. public static function get($cid = null)
  14. {
  15. return Coroutine::getContext($cid);
  16. }
  17. public static function getDataObject()
  18. {
  19. $context = self::get();
  20. if (!isset($context['data'])) {
  21. $context['data'] = new ArrayObject();
  22. }
  23. return $context['data'];
  24. }
  25. /**
  26. * 获取当前协程临时数据
  27. * @param string $key
  28. * @param null $default
  29. * @return mixed|null
  30. */
  31. public static function getData(string $key, $default = null)
  32. {
  33. if (self::hasData($key)) {
  34. return self::getDataObject()->offsetGet($key);
  35. }
  36. return $default;
  37. }
  38. /**
  39. * 判断是否存在临时数据
  40. * @param string $key
  41. * @return bool
  42. */
  43. public static function hasData(string $key)
  44. {
  45. return self::getDataObject()->offsetExists($key);
  46. }
  47. /**
  48. * 写入临时数据
  49. * @param string $key
  50. * @param $value
  51. */
  52. public static function setData(string $key, $value)
  53. {
  54. self::getDataObject()->offsetSet($key, $value);
  55. }
  56. /**
  57. * 删除数据
  58. * @param string $key
  59. */
  60. public static function removeData(string $key)
  61. {
  62. if (self::hasData($key)) {
  63. self::getDataObject()->offsetUnset($key);
  64. }
  65. }
  66. /**
  67. * 如果不存在则写入数据
  68. * @param string $key
  69. * @param $value
  70. * @return mixed|null
  71. */
  72. public static function rememberData(string $key, $value)
  73. {
  74. if (self::hasData($key)) {
  75. return self::getData($key);
  76. }
  77. if ($value instanceof Closure) {
  78. // 获取缓存数据
  79. $value = $value();
  80. }
  81. self::setData($key, $value);
  82. return $value;
  83. }
  84. /**
  85. * @internal
  86. * 清空数据
  87. */
  88. public static function clear()
  89. {
  90. self::getDataObject()->exchangeArray([]);
  91. }
  92. /**
  93. * 获取当前协程ID
  94. * @return mixed
  95. */
  96. public static function getCoroutineId()
  97. {
  98. return Coroutine::getuid();
  99. }
  100. }