ChannelSpecialManage.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace app\common\model;
  3. use app\common\library\Redis;
  4. use think\Cache;
  5. use think\Model;
  6. class ChannelSpecialManage extends Model
  7. {
  8. // 表名
  9. protected $table = 'channel_special_manage';
  10. // 自动写入时间戳字段
  11. protected $autoWriteTimestamp = 'int';
  12. // 定义时间戳字段名
  13. protected $createTime = 'createtime';
  14. protected $updateTime = 'updatetime';
  15. protected $redisKey = "CFW:";
  16. // 追加属性
  17. protected $append = [];
  18. protected static function init()
  19. {
  20. parent::init(); // TODO: Change the autogenerated stub
  21. self::afterUpdate(function ($model) {
  22. $model->removeCache($model->rule_name);
  23. });
  24. self::afterDelete(function ($model) {
  25. $model->removeCache($model->rule_name);
  26. });
  27. }
  28. /**
  29. * 是否是白名单
  30. * @param $rule_name
  31. * @param $channel_id
  32. * @return int
  33. */
  34. public function isWhite($rule_name, $channel_id)
  35. {
  36. $isWhite = 0;
  37. $redisKey = $this->redisKey.$rule_name;
  38. $redisData = Redis::instance()->hGetAll($redisKey);
  39. $fromDb = false;
  40. if (!empty($redisData)) {
  41. if (isset($redisData['expire_time']) && $redisData['expire_time'] <= time()) {
  42. $fromDb = true;
  43. } else {
  44. if (strrpos($redisData['channel_id'], '*') !== false) {
  45. //全部
  46. $isWhite = 1;
  47. } else if (strlen($redisData['channel_id']) > 0) {
  48. $channelIdArr = explode(',', $redisData['channel_id']);
  49. if (in_array($channel_id, $channelIdArr)) {
  50. $isWhite = 1;
  51. }
  52. }
  53. }
  54. } else {
  55. $fromDb = true;
  56. }
  57. if ($fromDb) {
  58. //读库缓存所有的结果
  59. $data = [
  60. 'channel_id' => ''
  61. ];
  62. $dbRow = $this->where('rule_name', 'eq', $rule_name)->find();
  63. if ($dbRow) {
  64. $data = $dbRow->toArray();
  65. $channelIdsRow =model("ChannelMenuList")->where('id', 'eq', $data['channel_id'])->find();
  66. $data['channel_id'] = $channelIdsRow['channel_id'] ?: '';
  67. if (strrpos($data['channel_id'], '*') !== false) {
  68. //全部
  69. $isWhite = 1;
  70. } else if (strlen($data['channel_id']) > 0) {
  71. $channelIdArr = explode(',', $data['channel_id']);
  72. if (in_array($channel_id, $channelIdArr)) {
  73. $isWhite = 1;
  74. }
  75. }
  76. }
  77. $data['expire_time'] = time() + 600;
  78. //写入redis 哈希结构
  79. Redis::instance()->hMSet($redisKey, $data);
  80. $expire = 3600 + mt_rand(0, 1000);
  81. Redis::instance()->expire($redisKey, $expire);
  82. }
  83. return $isWhite;
  84. }
  85. public function removeCache($rule_name)
  86. {
  87. $key = $this->redisKey.$rule_name;
  88. Redis::instance()->del($key);
  89. }
  90. }