source: spip-zone/_plugins_/memoization/memo/filecache.inc @ 32462

Last change on this file since 32462 was 32462, checked in by fil@…, 11 years ago

nettoyage de l'API et appels moins cryptiques

File size: 2.2 KB
Line 
1<?php
2
3/*
4mixed cache_get(string key)
5bool  cache_set(string key, mixed value [, int ttl])
6bool  cache_isset(string key)
7bool  cache_unset(string key)
8int   cache_inc(string key [, int value [, int ttl]])
9int   cache_dec(string key [, int value [, int ttl]])
10bool  cache_lock(string key)
11bool  cache_unlock(string key)
12*/
13
14@define('_DIR_TMP_XCACHE', (defined('_DIR_TMP') ? _DIR_TMP : 'tmp/').'xcache/');
15
16function cache_filename($u) {
17        if (!is_dir(_DIR_TMP_XCACHE))
18                @mkdir(_DIR_TMP_XCACHE);
19        return _DIR_TMP_XCACHE.substr(md5($u),0,4); # soit 16^4 fichiers max
20}
21
22function cache_get($key) {
23        if ($c = @file_get_contents(cache_filename($key))
24        AND $r = unserialize($c)
25        AND $r[1] == $key
26        AND $r[2] <= time())
27                return $r[0];
28}
29
30function cache_set($key, $value, $ttl=null) {
31        $r = array($value);
32        $r[1] = $key;
33        $r[2] = isset($value)
34                ? time() + intval($value)
35                : time() + 365*24*3600;
36        return (
37                $f = cache_filename($key)
38                AND $n = @tempnam(dirname($f), 'xc')
39                AND $h = @fopen($n, 'w')
40                AND @fwrite($h, serialize($r))
41                AND @fclose($h)
42                AND @rename($n, $f)
43        );
44}
45
46function cache_isset($key) {
47        if ($c = file_get_contents(cache_filename($key))
48        AND $r = unserialize($c)
49        AND $r[1] == $key
50        AND $r[2] <= time())
51                return true;
52        else
53                return false;
54}
55
56function cache_unset($key) {
57        return (
58                $c = file_get_contents($f = cache_filename($key))
59                AND $s = supprimer_fichier($f)
60                AND $r = unserialize($c)
61                AND $r[1] == $key
62                AND $r[2] <= time()
63        );
64}
65
66function cache_inc($key) {
67        while (!cache_lock($key)){ sleep(1); }
68        $value = 1+intval(cache_get($key));
69        cache_set($key, $value);
70        cache_unlock($key);
71        return $value;
72}
73
74function cache_dec($key) {
75        while (!cache_lock($key)){ sleep(1); }
76        $value = -1 + intval(cache_get($key));
77        cache_set($key, $value);
78        cache_unlock($key);
79        return $value;
80}
81
82function cache_lock($key, /* private */ $unlock=false) {
83        static $locks = array();
84        $f = cache_filename($key);
85
86        if ($unlock) {
87                return isset($locks[$f])
88                        AND is_resource($locks[$f])
89                        AND @flock($locks[$f], LOCK_UN)
90                        AND @fclose($locks[$f]);
91        } else {
92                return ($locks[$f] = @fopen($f, 'w'))
93                        AND @flock($locks[$f], LOCK_EX);
94        }
95}
96
97function cache_unlock($key) {
98        return cache_lock($key, true);
99}
100
101?>
Note: See TracBrowser for help on using the repository browser.