Clear.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace app\store\service\setting;
  3. use app\common\library\helper;
  4. use app\common\service\BaseService;
  5. use think\facade\Cache as CacheDrive;
  6. /**
  7. * 清理后台缓存服务
  8. * Class Clear
  9. * @package app\store\service\setting
  10. */
  11. class Clear extends BaseService
  12. {
  13. const ITEM_TYPE_CACHE = 'cache';
  14. const ITEM_TYPE_FILE = 'file';
  15. /**
  16. * 数据缓存项目(只显示key和name)
  17. * @return array
  18. */
  19. public function items(): array
  20. {
  21. $items = [];
  22. foreach ($this->getItems() as $key => $item) {
  23. $items[] = [
  24. 'key' => $key,
  25. 'name' => $item['name']
  26. ];
  27. }
  28. return $items;
  29. }
  30. /**
  31. * 数据缓存项目
  32. * @return array
  33. */
  34. private function getItems(): array
  35. {
  36. $storeId = $this->getStoreId();
  37. return [
  38. 'category' => [
  39. 'type' => self::ITEM_TYPE_CACHE,
  40. 'key' => "category_{$storeId}",
  41. 'name' => '商品分类'
  42. ],
  43. 'setting' => [
  44. 'type' => self::ITEM_TYPE_CACHE,
  45. 'key' => "setting_{$storeId}",
  46. 'name' => '商城设置'
  47. ],
  48. 'wxapp' => [
  49. 'type' => self::ITEM_TYPE_CACHE,
  50. 'key' => "wxapp_setting_{$storeId}",
  51. 'name' => '微信小程序设置'
  52. ],
  53. 'h5' => [
  54. 'type' => self::ITEM_TYPE_CACHE,
  55. 'key' => "wxapp_h5_{$storeId}",
  56. 'name' => 'H5端设置'
  57. ],
  58. 'temp' => [
  59. 'type' => self::ITEM_TYPE_FILE,
  60. 'name' => '临时图片',
  61. 'dirPath' => [
  62. 'web' => web_path() . "temp/{$storeId}/",
  63. 'runtime' => runtime_root_path() . "/image/{$storeId}/",
  64. ]
  65. ],
  66. 'local' => [
  67. 'type' => self::ITEM_TYPE_FILE,
  68. 'name' => '临时文件',
  69. 'dirPath' => [
  70. 'batch-delivery' => runtime_root_path() . "local/batch-delivery/{$storeId}/",
  71. 'goods-import' => runtime_root_path() . "local/goods-import/{$storeId}/",
  72. ]
  73. ],
  74. ];
  75. }
  76. /**
  77. * 删除缓存
  78. * @param array $keys
  79. */
  80. public function rmCache(array $keys)
  81. {
  82. $cacheList = $this->getItems();
  83. $keys = array_intersect(array_keys($cacheList), $keys);
  84. foreach ($keys as $key) {
  85. $item = $cacheList[$key];
  86. if ($item['type'] === self::ITEM_TYPE_CACHE) {
  87. CacheDrive::has($item['key']) && CacheDrive::delete($item['key']);
  88. } elseif ($item['type'] === 'file') {
  89. $this->deltree($item['dirPath']);
  90. }
  91. }
  92. }
  93. /**
  94. * 删除目录下所有文件
  95. * @param string|array $dirPath
  96. */
  97. private function deltree($dirPath)
  98. {
  99. if (!is_array($dirPath)) {
  100. $this->deleteFolder($dirPath);
  101. return;
  102. }
  103. foreach ($dirPath as $path) {
  104. $this->deleteFolder($path);
  105. }
  106. }
  107. /**
  108. * 递归删除指定目录下所有文件
  109. * @param string $path
  110. * @return void
  111. */
  112. private function deleteFolder(string $path): void
  113. {
  114. if (!is_dir($path)) {
  115. return;
  116. }
  117. // 扫描一个文件夹内的所有文件夹和文件
  118. foreach (scandir($path) as $val) {
  119. // 排除目录中的.和..
  120. if (!in_array($val, ['.', '..'])) {
  121. // 如果是目录则递归子目录,继续操作
  122. if (is_dir("{$path}{$val}")) {
  123. // 子目录中操作删除文件夹和文件
  124. $this->deleteFolder("{$path}{$val}/");
  125. // 目录清空后删除空文件夹
  126. rmdir("{$path}{$val}/");
  127. } else {
  128. // 如果是文件直接删除
  129. unlink("{$path}{$val}");
  130. }
  131. }
  132. }
  133. }
  134. }