source: spip-zone/_plugins_/scssphp/trunk/lib/scssphp/src/Cache.php @ 115043

Last change on this file since 115043 was 115043, checked in by cedric@…, 2 years ago

On integre le gros upgrade de la librairie ScssPHP en provenance de https://github.com/Cerdic/scssphp/tree/maint/leafo/master qui est une branche de maintenance forkee de https://github.com/leafo/scssphp et qui intègre proprement toutes les PR en attente chez leafo
Notamment des ameliorations de perf notables sur le parseur, et un vrai fix pour la compilation de BS4, car celui qui etait integre provoquait d'autre bug
Tout est propre, tous les patchs mis a jour sont dans des PR chez leafo, donc si il veut maintenir il peut tout integrer, mais comme rien ne bouge chez lui depuis un moment on bascule sur ce fork en attendant de voir ce qu'il se passe

File size: 5.0 KB
Line 
1<?php
2/**
3 * SCSSPHP
4 *
5 * @copyright 2012-2018 Leaf Corcoran
6 *
7 * @license http://opensource.org/licenses/MIT MIT
8 *
9 * @link http://leafo.github.io/scssphp
10 */
11
12namespace Leafo\ScssPhp;
13
14use Exception;
15
16/**
17 * The scss cacher.
18 *
19 * In summary:
20 *
21 * TODO
22 */
23
24/**
25 * SCSS cache
26 *
27 * @author Cedric Morin
28 */
29class Cache
30{
31
32    const CACHE_VERSION = 0;
33
34
35    // directory used for storing data
36    public static $cache_dir = false;
37
38    // prefix for the storing data
39    public static $prefix = 'scssphp_';
40
41    public static $force_refresh = false;
42
43    // specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up
44    public static $gc_lifetime = 604800;
45
46
47    /**
48     * Constructor
49     */
50    public function __construct($options)
51    {
52        //check $cache_dir
53        if (isset($options['cache_dir'])) {
54            self::$cache_dir = $options['cache_dir'];
55        }
56
57        if (empty(self::$cache_dir)) {
58            throw new Exception('cache_dir not set');
59        }
60
61        if (isset($options['prefix'])) {
62            self::$prefix = $options['prefix'];
63        }
64
65        if (empty(self::$prefix)) {
66            throw new Exception('prefix not set');
67        }
68
69        if (isset($options['force_refresh'])) {
70            self::$force_refresh = $options['force_refresh'];
71        }
72
73        self::checkCacheDir();
74    }
75
76
77    /**
78     * Generic get
79     *    Get the previous computed result of $what, affected by $options
80     *
81     * @param string $operation
82     *   parse, compile?
83     * @param $what
84     *  content key (filename to be treated?)
85     * @param array $options
86     *  any option that affect the operation result on the content
87     * @param int $last_modified
88     * @return mixed
89     * @throws Exception
90     */
91    public function getCache($operation, $what, $options = array(), $last_modified = null)
92    {
93
94        $fileCache = self::$cache_dir . self::cacheName($operation, $what, $options);
95
96        if (! self::$force_refresh
97          and file_exists($fileCache)) {
98            $cache_time = filemtime($fileCache);
99            if ((is_null($last_modified) or $cache_time > $last_modified)
100              and $cache_time + self::$gc_lifetime > time()) {
101                $c = file_get_contents($fileCache);
102                $c = unserialize($c);
103                if (is_array($c) and isset($c['value'])) {
104                    return $c['value'];
105                }
106            }
107        }
108
109        return null;
110    }
111
112    public function setCache($operation, $what, $value, $options = array())
113    {
114        $fileCache = self::$cache_dir . self::cacheName($operation, $what, $options);
115
116        $c = array('value' => $value);
117        $c = serialize($c);
118        file_put_contents($fileCache, $c);
119    }
120
121
122    private static function cacheName($operation, $what, $options = array())
123    {
124
125        $t = array(
126          'version' => self::CACHE_VERSION,
127          'operation' => $operation,
128          'what' => $what,
129          'options' => $options
130        );
131
132        $t = self::$prefix
133          . sha1(json_encode($t))
134          . ".$operation"
135          . ".scsscache";
136
137        return $t;
138    }
139
140
141    public static function checkCacheDir()
142    {
143
144        self::$cache_dir = str_replace('\\', '/', self::$cache_dir);
145        self::$cache_dir = rtrim(self::$cache_dir, '/') . '/';
146
147        if (! file_exists(self::$cache_dir)) {
148            if (! mkdir(self::$cache_dir)) {
149                throw new Exception('Cache directory couldn\'t be created: ' . self::$cache_dir);
150            }
151        } elseif (! is_dir(self::$cache_dir)) {
152            throw new Exception('Cache directory doesn\'t exist: ' . self::$cache_dir);
153        } elseif (! is_writable(self::$cache_dir)) {
154            throw new Exception('Cache directory isn\'t writable: ' . self::$cache_dir);
155        }
156    }
157
158    /**
159     * Delete unused cached files
160     *
161     */
162    public static function cleanCache()
163    {
164        static $clean = false;
165
166
167        if ($clean || empty(self::$cache_dir)) {
168            return;
169        }
170
171        $clean = true;
172
173        // only remove files with extensions created by SCSSPHP Cache
174        // css files removed based on the list files
175        $remove_types = array('scsscache' => 1);
176
177        $files = scandir(self::$cache_dir);
178        if (! $files) {
179            return;
180        }
181
182        $check_time = time() - self::$gc_lifetime;
183        foreach ($files as $file) {
184            // don't delete if the file wasn't created with SCSSPHP Cache
185            if (strpos($file, self::$prefix) !== 0) {
186                continue;
187            }
188
189            $parts = explode('.', $file);
190            $type = array_pop($parts);
191
192
193            if (! isset($remove_types[$type])) {
194                continue;
195            }
196
197            $full_path = self::$cache_dir . $file;
198            $mtime = filemtime($full_path);
199
200            // don't delete if it's a relatively new file
201            if ($mtime > $check_time) {
202                continue;
203            }
204
205            unlink($full_path);
206        }
207    }
208}
Note: See TracBrowser for help on using the repository browser.