]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/adodb-memcache.lib.inc.php
Upgrade adodb
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / adodb-memcache.lib.inc.php
1 <?php
2
3 // security - hide paths
4 if (!defined('ADODB_DIR')) die();
5
6 global $ADODB_INCLUDED_MEMCACHE;
7 $ADODB_INCLUDED_MEMCACHE = 1;
8
9 global $ADODB_INCLUDED_CSV;
10 if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
11
12 /* 
13
14   V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved.
15   Released under both BSD license and Lesser GPL library license. 
16   Whenever there is any discrepancy between the two licenses, 
17   the BSD license will take precedence. See License.txt. 
18   Set tabs to 4 for best viewing.
19   
20   Latest version is available at http://adodb.sourceforge.net
21
22 Usage:
23   
24 $db = NewADOConnection($driver);
25 $db->memCache = true; /// should we use memCache instead of caching in files
26 $db->memCacheHost = array($ip1, $ip2, $ip3);
27 $db->memCachePort = 11211; /// this is default memCache port
28 $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
29
30 $db->Connect(...);
31 $db->CacheExecute($sql);
32   
33   Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect.
34   
35   Class instance is stored in $ADODB_CACHE
36 */
37
38         class ADODB_Cache_MemCache {
39                 var $createdir = false; // create caching directory structure?
40                 
41                 //-----------------------------
42                 // memcache specific variables
43                 
44                 var $hosts;     // array of hosts
45                 var $port = 11211;
46                 var $compress = false; // memcache compression with zlib
47                 
48                 var $_connected = false;
49                 var $_memcache = false;
50                 
51                 function ADODB_Cache_MemCache(&$obj)
52                 {
53                         $this->hosts = $obj->memCacheHost;
54                         $this->port = $obj->memCachePort;
55                         $this->compress = $obj->memCacheCompress;
56                 }
57                 
58                 // implement as lazy connection. The connection only occurs on CacheExecute call
59                 function connect(&$err)
60                 {
61                         if (!function_exists('memcache_pconnect')) {
62                                 $err = 'Memcache module PECL extension not found!';
63                                 return false;
64                         }
65
66                         $memcache = new MemCache;
67                         
68                         if (!is_array($this->hosts)) $this->hosts = array($this->hosts);
69                 
70                         $failcnt = 0;
71                         foreach($this->hosts as $host) {
72                                 if (!@$memcache->addServer($host,$this->port,true)) {
73                                         $failcnt += 1;
74                                 }
75                         }
76                         if ($failcnt == sizeof($this->hosts)) {
77                                 $err = 'Can\'t connect to any memcache server';
78                                 return false;
79                         }
80                         $this->_connected = true;
81                         $this->_memcache = $memcache;
82                         return true;
83                 }
84                 
85                 // returns true or false. true if successful save
86                 function writecache($filename, $contents, $debug, $secs2cache)
87                 {
88                         if (!$this->_connected) {
89                                 $err = '';
90                                 if (!$this->connect($err) && $debug) ADOConnection::outp($err);
91                         }
92                         if (!$this->_memcache) return false;
93                         
94                         if (!$this->_memcache->set($filename, $contents, $this->compress ? MEMCACHE_COMPRESSED : 0, $secs2cache)) {
95                                 if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n");
96                                 return false;
97                         }
98                         
99                         return true;
100                 }
101                 
102                 // returns a recordset
103                 function readcache($filename, &$err, $secs2cache, $rsClass)
104                 {
105                         $false = false;
106                         if (!$this->_connected) $this->connect($err);
107                         if (!$this->_memcache) return $false;
108                         
109                         $rs = $this->_memcache->get($filename);
110                         if (!$rs) {
111                                 $err = 'Item with such key doesn\'t exists on the memcached server.';
112                                 return $false;
113                         }
114                         
115                         // hack, should actually use _csv2rs
116                         $rs = explode("\n", $rs);
117             unset($rs[0]);
118             $rs = join("\n", $rs);
119                         $rs = unserialize($rs);
120                         if (! is_object($rs)) {
121                                 $err = 'Unable to unserialize $rs';             
122                                 return $false;
123                         }
124                         if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere
125                         
126                         $tdiff = intval($rs->timeCreated+$secs2cache - time());
127                         if ($tdiff <= 2) {
128                                 switch($tdiff) {
129                                         case 2: 
130                                                 if ((rand() & 15) == 0) {
131                                                         $err = "Timeout 2";
132                                                         return $false;
133                                                 }
134                                                 break;
135                                         case 1:
136                                                 if ((rand() & 3) == 0) {
137                                                         $err = "Timeout 1";
138                                                         return $false;
139                                                 }
140                                                 break;
141                                         default: 
142                                                 $err = "Timeout 0";
143                                                 return $false;
144                                 }
145                         }
146                         return $rs;
147                 }
148                 
149                 function flushall($debug=false)
150                 {
151                         if (!$this->_connected) {
152                                 $err = '';
153                                 if (!$this->connect($err) && $debug) ADOConnection::outp($err);
154                         }
155                         if (!$this->_memcache) return false;
156                         
157                         $del = $this->_memcache->flush();
158                         
159                         if ($debug) 
160                                 if (!$del) ADOConnection::outp("flushall: failed!<br>\n");
161                                 else ADOConnection::outp("flushall: succeeded!<br>\n");
162                                 
163                         return $del;
164                 }
165                 
166                 function flushcache($filename, $debug=false)
167                 {
168                         if (!$this->_connected) {
169                                 $err = '';
170                                 if (!$this->connect($err) && $debug) ADOConnection::outp($err); 
171                         } 
172                         if (!$this->_memcache) return false;
173   
174                         $del = $this->_memcache->delete($filename);
175                         
176                         if ($debug) 
177                                 if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!<br>\n");
178                                 else ADOConnection::outp("flushcache: $key entry flushed from memcached server!<br>\n");
179                                 
180                         return $del;
181                 }
182                 
183                 // not used for memcache
184                 function createdir($dir, $hash) 
185                 {
186                         return true;
187                 }
188         }
189
190 ?>