]> git.wh0rd.org Git - tt-rss.git/blob - magpierss/rss_cache.inc
update_daemon2: print idle notice once per 10 seconds
[tt-rss.git] / magpierss / rss_cache.inc
1 <?php
2 /*
3  * Project:     MagpieRSS: a simple RSS integration tool
4  * File:        rss_cache.inc, a simple, rolling(no GC), cache 
5  *              for RSS objects, keyed on URL.
6  * Author:      Kellan Elliott-McCrea <kellan@protest.net>
7  * Version:     0.51
8  * License:     GPL
9  *
10  * The lastest version of MagpieRSS can be obtained from:
11  * http://magpierss.sourceforge.net
12  *
13  * For questions, help, comments, discussion, etc., please join the
14  * Magpie mailing list:
15  * http://lists.sourceforge.net/lists/listinfo/magpierss-general
16  *
17  */
18
19 class RSSCache {
20     var $BASE_CACHE = './cache';    // where the cache files are stored
21     var $MAX_AGE    = 3600;         // when are files stale, default one hour
22     var $ERROR      = "";           // accumulate error messages
23     
24     function RSSCache ($base='', $age='') {
25         if ( $base ) {
26             $this->BASE_CACHE = $base;
27         }
28         if ( $age ) {
29             $this->MAX_AGE = $age;
30         }
31         
32         // attempt to make the cache directory
33         if ( ! file_exists( $this->BASE_CACHE ) ) {
34             $status = @mkdir( $this->BASE_CACHE, 0755 );
35             
36             // if make failed 
37             if ( ! $status ) {
38                 $this->error(
39                     "Cache couldn't make dir '" . $this->BASE_CACHE . "'."
40                 );
41             }
42         }
43     }
44     
45 /*=======================================================================*\
46     Function:   set
47     Purpose:    add an item to the cache, keyed on url
48     Input:      url from wich the rss file was fetched
49     Output:     true on sucess  
50 \*=======================================================================*/
51     function set ($url, $rss) {
52         $this->ERROR = "";
53         $cache_file = $this->file_name( $url );
54         $fp = @fopen( $cache_file, 'w' );
55         
56         if ( ! $fp ) {
57             $this->error(
58                 "Cache unable to open file for writing: $cache_file"
59             );
60             return 0;
61         }
62         
63         
64         $data = $this->serialize( $rss );
65         fwrite( $fp, $data );
66         fclose( $fp );
67         
68         return $cache_file;
69     }
70     
71 /*=======================================================================*\
72     Function:   get
73     Purpose:    fetch an item from the cache
74     Input:      url from wich the rss file was fetched
75     Output:     cached object on HIT, false on MISS 
76 \*=======================================================================*/ 
77     function get ($url) {
78         $this->ERROR = "";
79         $cache_file = $this->file_name( $url );
80         
81         if ( ! file_exists( $cache_file ) ) {
82             $this->debug( 
83                 "Cache doesn't contain: $url (cache file: $cache_file)"
84             );
85             return 0;
86         }
87         
88         $fp = @fopen($cache_file, 'r');
89         if ( ! $fp ) {
90             $this->error(
91                 "Failed to open cache file for reading: $cache_file"
92             );
93             return 0;
94         }
95         
96         if ($filesize = filesize($cache_file) ) {
97                 $data = fread( $fp, filesize($cache_file) );
98                 $rss = $this->unserialize( $data );
99         
100                 return $rss;
101         }
102         
103         return 0;
104     }
105
106 /*=======================================================================*\
107     Function:   check_cache
108     Purpose:    check a url for membership in the cache
109                 and whether the object is older then MAX_AGE (ie. STALE)
110     Input:      url from wich the rss file was fetched
111     Output:     cached object on HIT, false on MISS 
112 \*=======================================================================*/     
113     function check_cache ( $url ) {
114         $this->ERROR = "";
115         $filename = $this->file_name( $url );
116         
117         if ( file_exists( $filename ) ) {
118             // find how long ago the file was added to the cache
119             // and whether that is longer then MAX_AGE
120             $mtime = filemtime( $filename );
121             $age = time() - $mtime;
122             if ( $this->MAX_AGE > $age ) {
123                 // object exists and is current
124                 return 'HIT';
125             }
126             else {
127                 // object exists but is old
128                 return 'STALE';
129             }
130         }
131         else {
132             // object does not exist
133             return 'MISS';
134         }
135     }
136
137         function cache_age( $cache_key ) {
138                 $filename = $this->file_name( $url );
139                 if ( file_exists( $filename ) ) {
140                         $mtime = filemtime( $filename );
141             $age = time() - $mtime;
142                         return $age;
143                 }
144                 else {
145                         return -1;      
146                 }
147         }
148         
149 /*=======================================================================*\
150     Function:   serialize
151 \*=======================================================================*/     
152     function serialize ( $rss ) {
153         return serialize( $rss );
154     }
155
156 /*=======================================================================*\
157     Function:   unserialize
158 \*=======================================================================*/     
159     function unserialize ( $data ) {
160         return unserialize( $data );
161     }
162     
163 /*=======================================================================*\
164     Function:   file_name
165     Purpose:    map url to location in cache
166     Input:      url from wich the rss file was fetched
167     Output:     a file name
168 \*=======================================================================*/     
169     function file_name ($url) {
170         $filename = md5( $url );
171         return join( DIRECTORY_SEPARATOR, array( $this->BASE_CACHE, $filename ) );
172     }
173
174 /*=======================================================================*\
175     Function:   error
176     Purpose:    register error
177 \*=======================================================================*/         
178     function error ($errormsg, $lvl=E_USER_WARNING) {
179         // append PHP's error message if track_errors enabled
180         if ( isset($php_errormsg) ) { 
181             $errormsg .= " ($php_errormsg)";
182         }
183         $this->ERROR = $errormsg;
184         if ( MAGPIE_DEBUG ) {
185             trigger_error( $errormsg, $lvl);
186         }
187         else {
188             error_log( $errormsg, 0);
189         }
190     }
191     
192     function debug ($debugmsg, $lvl=E_USER_NOTICE) {
193         if ( MAGPIE_DEBUG ) {
194             $this->error("MagpieRSS [debug] $debugmsg", $lvl);
195         }
196     }
197
198 }
199
200 ?>