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

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

apres quelques tests et debug, retour a l'API complete de cache_inc(key, VALUE, TTL)

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($ttl)
34                ? time() + intval($ttl)
35                : time() + 365*24*3600;
36
37        return (
38                $f = cache_filename($key)
39                AND $n = @tempnam(dirname($f), 'xc')
40                AND $h = @fopen($n, 'w')
41                AND @fwrite($h, serialize($r))
42                AND @fclose($h)
43                AND @rename($n, $f)
44        );
45}
46
47function cache_isset($key) {
48        if ($c = file_get_contents(cache_filename($key))
49        AND $r = unserialize($c)
50        AND $r[1] == $key
51        AND $r[2] <= time())
52                return true;
53        else
54                return false;
55}
56
57function cache_unset($key) {
58        return (
59                $c = file_get_contents($f = cache_filename($key))
60                AND $s = supprimer_fichier($f)
61                AND $r = unserialize($c)
62                AND $r[1] == $key
63                AND $r[2] <= time()
64        );
65}
66
67function cache_inc($key, $value=null, $ttl=null) {
68        while (!cache_lock($key)){ sleep(1); }
69        $value = (isset($value) ? intval($value) : 1) + intval(cache_get($key));
70        cache_set($key, $value);
71        cache_unlock($key);
72        return $value;
73}
74
75function cache_dec($key, $value=null, $ttl=null) {
76        $value = isset($value) ? intval($value) : 1;
77        return cache_inc($key, -$value, $ttl);
78}
79
80function cache_lock($key, /* private */ $unlock=false) {
81        static $locks = array();
82        $f = cache_filename($key);
83
84        if ($unlock) {
85                return isset($locks[$f])
86                        AND is_resource($locks[$f])
87                        AND @flock($locks[$f], LOCK_UN)
88                        AND @fclose($locks[$f]);
89        } else {
90                return ($locks[$f] = @fopen($f, 'a'))
91                        AND @flock($locks[$f], LOCK_EX);
92        }
93}
94
95function cache_unlock($key) {
96        return cache_lock($key, true);
97}
98
99?>
Note: See TracBrowser for help on using the repository browser.