Clear.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2024 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\store\service\setting;
  13. use think\facade\Cache as CacheDrive;
  14. use app\common\service\BaseService;
  15. /**
  16. * 清理后台缓存服务
  17. * Class Clear
  18. * @package app\store\service\setting
  19. */
  20. class Clear extends BaseService
  21. {
  22. const ITEM_TYPE_CACHE = 'cache';
  23. const ITEM_TYPE_FILE = 'file';
  24. /**
  25. * 数据缓存项目(只显示key和name)
  26. * @return array
  27. */
  28. public function items(): array
  29. {
  30. $data = $this->getItems();
  31. $items = [];
  32. foreach ($data as $key => $item) {
  33. $items[] = [
  34. 'key' => $key,
  35. 'name' => $item['name']
  36. ];
  37. }
  38. return $items;
  39. }
  40. /**
  41. * 数据缓存项目
  42. * @return array
  43. */
  44. private function getItems(): array
  45. {
  46. $storeId = $this->getStoreId();
  47. return [
  48. 'category' => [
  49. 'type' => self::ITEM_TYPE_CACHE,
  50. 'key' => "category_{$storeId}",
  51. 'name' => '商品分类'
  52. ],
  53. 'setting' => [
  54. 'type' => self::ITEM_TYPE_CACHE,
  55. 'key' => "setting_{$storeId}",
  56. 'name' => '商城设置'
  57. ],
  58. 'wxapp' => [
  59. 'type' => self::ITEM_TYPE_CACHE,
  60. 'key' => "wxapp_setting_{$storeId}",
  61. 'name' => '微信小程序设置',
  62. ],
  63. 'h5' => [
  64. 'type' => self::ITEM_TYPE_CACHE,
  65. 'key' => "wxapp_h5_{$storeId}",
  66. 'name' => 'H5端设置',
  67. ],
  68. 'payment' => [
  69. 'type' => self::ITEM_TYPE_CACHE,
  70. 'key' => "payment_{$storeId}",
  71. 'name' => '支付设置'
  72. ],
  73. 'temp' => [
  74. 'type' => self::ITEM_TYPE_FILE,
  75. 'name' => '临时图片',
  76. 'dirPath' => [
  77. 'web' => web_path() . "temp/{$storeId}/",
  78. 'runtime' => runtime_root_path() . "/image/{$storeId}/",
  79. ]
  80. ],
  81. 'local' => [
  82. 'type' => self::ITEM_TYPE_FILE,
  83. 'name' => '临时文件',
  84. 'dirPath' => [
  85. 'batch-delivery' => runtime_root_path() . "local/batch-delivery/{$storeId}/",
  86. 'batch-goods' => runtime_root_path() . "local/batch-goods/{$storeId}/",
  87. ]
  88. ],
  89. ];
  90. }
  91. /**
  92. * 删除缓存
  93. * @param array $keys
  94. */
  95. public function rmCache(array $keys)
  96. {
  97. $cacheList = $this->getItems();
  98. $keys = \array_intersect(\array_keys($cacheList), $keys);
  99. foreach ($keys as $key) {
  100. $item = $cacheList[$key];
  101. if ($item['type'] === self::ITEM_TYPE_CACHE) {
  102. CacheDrive::has($item['key']) && CacheDrive::delete($item['key']);
  103. } elseif ($item['type'] === 'file') {
  104. $this->deltree($item['dirPath']);
  105. }
  106. }
  107. }
  108. /**
  109. * 删除目录下所有文件
  110. * @param string|array $dirPath
  111. */
  112. private function deltree($dirPath)
  113. {
  114. if (!is_array($dirPath)) {
  115. $this->deleteFolder($dirPath);
  116. return;
  117. }
  118. foreach ($dirPath as $path) {
  119. $this->deleteFolder($path);
  120. }
  121. }
  122. /**
  123. * 递归删除指定目录下所有文件
  124. * @param string $path
  125. * @return void
  126. */
  127. private function deleteFolder(string $path): void
  128. {
  129. if (!is_dir($path)) {
  130. return;
  131. }
  132. // 扫描一个文件夹内的所有文件夹和文件
  133. foreach (scandir($path) as $val) {
  134. // 排除目录中的.和..
  135. if (!in_array($val, ['.', '..'])) {
  136. // 如果是目录则递归子目录,继续操作
  137. if (is_dir("{$path}{$val}")) {
  138. // 子目录中操作删除文件夹和文件
  139. $this->deleteFolder("{$path}{$val}/");
  140. // 目录清空后删除空文件夹
  141. rmdir("{$path}{$val}/");
  142. } else {
  143. // 如果是文件直接删除
  144. unlink("{$path}{$val}");
  145. }
  146. }
  147. }
  148. }
  149. }