Subversion Repositories Sigmater

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 Andrea 1
<?php
2
/* fastcache.inc -- gestione veloce di cache file con validità
3
 *                  temporale impostabile dall'utente.
4
 *                  L'accesso al file da parte di processi
5
 *                  concorrenti viene serializzato.
6
 *
7
 * Il file fastcache_test.php contiene un esempio di uso.
8
 *
9
 * Versione 1.1, ultima modifica 8 marzo 2004 [27781]
10
 */
11
 
12
 
13
/* La funzione fcache_read legge il contenuto di un cache file
14
 * e lo deserializza nella variabile PHP passata come argomento.
15
 *
16
 * Parametri di input:
17
 *
18
 * $fname = nome del file di cache da leggere. Si consiglia di
19
 *          fornire il path completo.
20
 * $data  = variabile passata per riferimento, che viene impostata
21
 *          con il risultato della deserializzazione dei dati letti
22
 *          nel file di cache.
23
 *
24
 * Codici di ritorno:
25
 *
26
 * 0 = Tutto OK.
27
 * 1 = File inesistente.
28
 * 2 = Impossibile creare lock file.
29
 * 3 = Impossibile acquisire READ lock.
30
 * 4 = Impossibile aprire il file in lettura.
31
 * 5 = Cache scaduta.
32
 * 6 = Impossibile deserializzare i dati.
33
 */
34
 
35
function fcache_read($fname, &$data)
36
  {
37
  clearstatcache();
38
  if(false == file_exists($fname))
39
    return(1); // File inesistente.
40
  $om = file_exists($fname.'.lock') ? 'rb' : 'ab';
41
  $fd = @fopen($fname.'.lock', $om);
42
  if(false == $fd)
43
    return(2); // Impossibile creare lock file.
44
  if(!(@flock($fd, LOCK_SH)))
45
    {
46
    @fclose($fd);
47
    return(3); // Impossibile acquisire READ lock.
48
    }
49
  $fh = @fopen($fname, 'rb');
50
  if(false == $fh)
51
    {
52
    @flock($fd, LOCK_UN);
53
    @fclose($fd);
54
    return(4); // Impossibile aprire il file in lettura.
55
    }
56
  $ts = hexdec(rtrim(@fgets($fh, 32)));
57
  if(time() > $ts)
58
    {
59
    @fclose($fh);
60
    @flock($fd, LOCK_UN);
61
    @fclose($fd);
62
    return(5); // Cache scaduta.
63
    }
64
  $s = '';
65
  while(!feof($fh))
66
    $s .= fread($fh, 8192);
67
  @fclose($fh);
68
  @flock($fd, LOCK_UN);
69
  @fclose($fd);
70
  $data = unserialize($s);
71
  if(false == $data)
72
    return(6); // Impossibile deserializzare i dati.
73
  return(0); // Tutto OK.
74
  }
75
 
76
/* La funzione fcache_write inizializza il contenuto di un cache file
77
 * con i dati passati ed imposta il periodo di validità di questi ultimi.
78
 *
79
 * Parametri di input:
80
 *
81
 * $fname =   nome del file di cache da scrivere. Si consiglia di
82
 *            fornire il path completo.
83
 * $data  =   variabile che contiene i dati da impostare. Ciascun cache file
84
 *            contiene solo una variabile PHP, ma questa può essere anche un
85
 *            array associativo multidimensionale grande a piacere. Su Linux
86
 *            si consiglia di scrivere i file nel filesystem /dev/shm che è
87
 *            contenuto in memoria e di dimensioni massime pari a metà della
88
 *            memoria fisica della macchina.
89
 *            Ovviamente questo significa che i file in /dev/shm devono essere
90
 *            di piccole dimensioni e sacrificabili in caso di shutdown o crash
91
 *            del server: qualora non fosse rispettato uno dei vincoli esposti
92
 *            il cache file va creato su disco, magari in una directory tmp dove
93
 *            i file non più usati vengono automaticamente cancellati.
94
 * $timeout = numero di secondi di validità del cache file. Il parametro può
95
 *            essere omesso nella chiamata, ed in tal caso viene impostato
96
 *            a 60 secondi.
97
 *
98
 * Codici di ritorno:
99
 *
100
 * 0 = Tutto OK.
101
 * 1 = Non ci sono dati da scrivere!
102
 * 2 = Impossibile creare lock file.
103
 * 3 = Impossibile acquisire WRITE lock.
104
 * 4 = Impossibile aprire il file in scrittura.
105
 * 5 = Fallita scrittura cache file.
106
 * 6 = Il timeout non è valido.
107
 */
108
 
109
function fcache_write($fname, $data, $timeout = 60)
110
  {
111
  if(empty($data))
112
    return(1); // Non devo scrivere niente!
113
  if(!is_numeric($timeout) || $timeout <= 0)
114
    return(6); // Il timeout non è valido.
115
  clearstatcache();
116
  $om = file_exists($fname.'.lock') ? 'rb' : 'ab';
117
  $fd = @fopen($fname.'.lock', $om);
118
  if(false == $fd)
119
    return(2); // Impossibile creare lock file.
120
  if(!(@flock($fd, LOCK_EX)))
121
    {
122
    @fclose($fd);
123
    return(3); // Impossibile acquisire WRITE lock.
124
    }
125
  $fh = @fopen($fname, 'wb');
126
  if(false == $fh)
127
    {
128
    @flock($fd, LOCK_UN);
129
    @fclose($fd);
130
    return(4); // Impossibile aprire il file in scrittura.
131
    }
132
  $buffer = dechex(time() + (int)$timeout)."\n".serialize($data);
133
  $rc = @fwrite($fh, $buffer, strlen($buffer));
134
  @fclose($fh);
135
  if(0 == $rc)
136
    {
137
    @unlink($fname);
138
    @flock($fd, LOCK_UN);
139
    @fclose($fd);
140
    return(5); // Fallita scrittura cache file.
141
    }
142
  @flock($fd, LOCK_UN);
143
  @fclose($fd);
144
  return(0); // Tutto OK.
145
  }
146
 
147
/* La funzione fcache_delete cancella un cache file incondizionatamente.
148
 *
149
 * Parametri di input:
150
 *
151
 * $fname = nome del file di cache da cancellare. Si consiglia di
152
 *          fornire il path completo.
153
 *
154
 * Codici di ritorno:
155
 *
156
 * 0 = Tutto OK.
157
 * 1 = File inesistente.
158
 * 2 = Impossibile creare lock file.
159
 * 3 = Impossibile acquisire WRITE lock.
160
 */
161
 
162
function fcache_delete($fname)
163
  {
164
  clearstatcache();
165
  if(false == file_exists($fname))
166
    return(1); // File inesistente.
167
  $om = file_exists($fname.'.lock') ? 'rb' : 'ab';
168
  $fd = @fopen($fname.'.lock', $om);
169
  if(false == $fd)
170
    return(2); // Impossibile creare lock file.
171
  if(!(@flock($fd, LOCK_EX)))
172
    {
173
    @fclose($fd);
174
    return(3); // Impossibile acquisire WRITE lock.
175
    }
176
  @unlink($fname);
177
  @unlink($fname.'.lock');
178
  @flock($fd, LOCK_UN);
179
  @fclose($fd);
180
  return(0); // Tutto OK.
181
  }
182
?>