1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: |
|
9: |
|
10: | |
11: | |
12: | |
13: | |
14: | |
15: |
|
16: | class Smarty_Internal_Runtime_CacheResourceFile
|
17: | {
|
18: | |
19: | |
20: | |
21: | |
22: | |
23: | |
24: | |
25: | |
26: | |
27: | |
28: |
|
29: | public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
|
30: | {
|
31: | $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
32: | $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null;
|
33: | $_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
|
34: | $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
|
35: | $_dir = $smarty->getCacheDir();
|
36: | if ($_dir === '/') {
|
37: | return 0;
|
38: | }
|
39: | $_dir_length = strlen($_dir);
|
40: | if (isset($_cache_id)) {
|
41: | $_cache_id_parts = explode('|', $_cache_id);
|
42: | $_cache_id_parts_count = count($_cache_id_parts);
|
43: | if ($smarty->use_sub_dirs) {
|
44: | foreach ($_cache_id_parts as $id_part) {
|
45: | $_dir .= $id_part . '/';
|
46: | }
|
47: | }
|
48: | }
|
49: | if (isset($resource_name)) {
|
50: | $_save_stat = $smarty->caching;
|
51: | $smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
|
52: | $tpl = new $smarty->template_class($resource_name, $smarty);
|
53: | $smarty->caching = $_save_stat;
|
54: |
|
55: | $tpl->source;
|
56: | if ($tpl->source->exists) {
|
57: | $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath));
|
58: | } else {
|
59: | return 0;
|
60: | }
|
61: | }
|
62: | $_count = 0;
|
63: | $_time = time();
|
64: | if (file_exists($_dir)) {
|
65: | $_cacheDirs = new RecursiveDirectoryIterator($_dir);
|
66: | $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
|
67: | foreach ($_cache as $_file) {
|
68: | if (substr(basename($_file->getPathname()), 0, 1) === '.') {
|
69: | continue;
|
70: | }
|
71: | $_filepath = (string)$_file;
|
72: |
|
73: | if ($_file->isDir()) {
|
74: | if (!$_cache->isDot()) {
|
75: |
|
76: | @rmdir($_file->getPathname());
|
77: | }
|
78: | } else {
|
79: |
|
80: | if (substr($_filepath, -4) !== '.php') {
|
81: | continue;
|
82: | }
|
83: | $_parts = explode($_dir_sep, str_replace('\\', '/', substr($_filepath, $_dir_length)));
|
84: | $_parts_count = count($_parts);
|
85: |
|
86: | if (isset($resource_name)) {
|
87: | if ($_parts[ $_parts_count - 1 ] !== $_resourcename_parts) {
|
88: | continue;
|
89: | }
|
90: | }
|
91: |
|
92: | if (isset($_compile_id) && (!isset($_parts[ $_parts_count - 2 - $_compile_id_offset ])
|
93: | || $_parts[ $_parts_count - 2 - $_compile_id_offset ] !== $_compile_id)
|
94: | ) {
|
95: | continue;
|
96: | }
|
97: |
|
98: | if (isset($_cache_id)) {
|
99: |
|
100: | $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset :
|
101: | $_parts_count - 1 - $_compile_id_offset;
|
102: | if ($_parts_count < $_cache_id_parts_count) {
|
103: | continue;
|
104: | }
|
105: | for ($i = 0; $i < $_cache_id_parts_count; $i++) {
|
106: | if ($_parts[ $i ] !== $_cache_id_parts[ $i ]) {
|
107: | continue 2;
|
108: | }
|
109: | }
|
110: | }
|
111: | if (is_file($_filepath)) {
|
112: |
|
113: | if (isset($exp_time)) {
|
114: | if ($exp_time < 0) {
|
115: | preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_filepath), $match);
|
116: | if ($_time < (filemtime($_filepath) + $match[ 1 ])) {
|
117: | continue;
|
118: | }
|
119: | } else {
|
120: | if ($_time - filemtime($_filepath) < $exp_time) {
|
121: | continue;
|
122: | }
|
123: | }
|
124: | }
|
125: | $_count += @unlink($_filepath) ? 1 : 0;
|
126: | if (function_exists('opcache_invalidate')
|
127: | && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
128: | ) {
|
129: | opcache_invalidate($_filepath, true);
|
130: | } elseif (function_exists('apc_delete_file')) {
|
131: | apc_delete_file($_filepath);
|
132: | }
|
133: | }
|
134: | }
|
135: | }
|
136: | }
|
137: | return $_count;
|
138: | }
|
139: | }
|
140: | |