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

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

reglage des lock

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] ])
10null  cache_lock(string key)
11null  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        cache_lock($key);
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        /* unlock */
85        if ($unlock) {
86                if (isset($locks[$f])
87                AND is_resource($locks[$f])) {
88                        @flock($locks[$f], LOCK_UN);
89                        @fclose($locks[$f]);
90                        unset($locks[$f]);
91                }
92        }
93        /* lock */
94        else {
95                if (!isset($locks[$f])) {
96                        $locks[$f] = @fopen($f, 'a');
97                        @flock($locks[$f], LOCK_EX);
98                }
99        }
100}
101
102function cache_unlock($key) {
103        cache_lock($key, true);
104}
105
106?>
Note: See TracBrowser for help on using the repository browser.