3 // security - hide paths
4 if (!defined('ADODB_DIR')) die();
6 global $ADODB_INCLUDED_MEMCACHE;
7 $ADODB_INCLUDED_MEMCACHE = 1;
9 global $ADODB_INCLUDED_CSV;
10 if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR
.'/adodb-csvlib.inc.php');
14 V5.14 8 Sept 2011 (c) 2000-2011 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.
20 Latest version is available at http://adodb.sourceforge.net
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)
31 $db->CacheExecute($sql);
33 Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect.
35 Class instance is stored in $ADODB_CACHE
38 class ADODB_Cache_MemCache
{
39 var $createdir = false; // create caching directory structure?
41 //-----------------------------
42 // memcache specific variables
44 var $hosts; // array of hosts
46 var $compress = false; // memcache compression with zlib
48 var $_connected = false;
49 var $_memcache = false;
51 function ADODB_Cache_MemCache(&$obj)
53 $this->hosts
= $obj->memCacheHost
;
54 $this->port
= $obj->memCachePort
;
55 $this->compress
= $obj->memCacheCompress
;
58 // implement as lazy connection. The connection only occurs on CacheExecute call
59 function connect(&$err)
61 if (!function_exists('memcache_pconnect')) {
62 $err = 'Memcache module PECL extension not found!';
66 $memcache = new MemCache
;
68 if (!is_array($this->hosts
)) $this->hosts
= array($this->hosts
);
71 foreach($this->hosts
as $host) {
72 if (!@$memcache->addServer($host,$this->port
,true)) {
76 if ($failcnt == sizeof($this->hosts
)) {
77 $err = 'Can\'t connect to any memcache server';
80 $this->_connected
= true;
81 $this->_memcache
= $memcache;
85 // returns true or false. true if successful save
86 function writecache($filename, $contents, $debug, $secs2cache)
88 if (!$this->_connected
) {
90 if (!$this->connect($err) && $debug) ADOConnection
::outp($err);
92 if (!$this->_memcache
) return false;
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");
102 // returns a recordset
103 function readcache($filename, &$err, $secs2cache, $rsClass)
106 if (!$this->_connected
) $this->connect($err);
107 if (!$this->_memcache
) return $false;
109 $rs = $this->_memcache
->get($filename);
111 $err = 'Item with such key doesn\'t exists on the memcached server.';
115 // hack, should actually use _csv2rs
116 $rs = explode("\n", $rs);
118 $rs = join("\n", $rs);
119 $rs = unserialize($rs);
120 if (! is_object($rs)) {
121 $err = 'Unable to unserialize $rs';
124 if ($rs->timeCreated
== 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere
126 $tdiff = intval($rs->timeCreated+
$secs2cache - time());
130 if ((rand() & 15) == 0) {
136 if ((rand() & 3) == 0) {
149 function flushall($debug=false)
151 if (!$this->_connected
) {
153 if (!$this->connect($err) && $debug) ADOConnection
::outp($err);
155 if (!$this->_memcache
) return false;
157 $del = $this->_memcache
->flush();
160 if (!$del) ADOConnection
::outp("flushall: failed!<br>\n");
161 else ADOConnection
::outp("flushall: succeeded!<br>\n");
166 function flushcache($filename, $debug=false)
168 if (!$this->_connected
) {
170 if (!$this->connect($err) && $debug) ADOConnection
::outp($err);
172 if (!$this->_memcache
) return false;
174 $del = $this->_memcache
->delete($filename);
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");
183 // not used for memcache
184 function createdir($dir, $hash)