memCache = true; /// should we use memCache instead of caching in files $db->memCacheHost = array($ip1, $ip2, $ip3); $db->memCachePort = 11211; /// this is default memCache port $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) /// Note; compression is not supported w/the memcached library $db->Connect(...); $db->CacheExecute($sql); Notes; The memcache class is shared by all connections, is created during the first call to Connect/PConnect. We'll look for both the memcache library (https://pecl.php.net/package/memcache) and the memcached library (https://pecl.php.net/package/memcached). If both exist, the memcache library will be used. Class instance is stored in $ADODB_CACHE */ class ADODB_Cache_MemCache { var $createdir = false; // create caching directory structure? // $library will be populated with the proper library on connect // and is used later when there are differences in specific calls // between memcache and memcached var $library = false; //----------------------------- // memcache specific variables var $hosts; // array of hosts var $port = 11211; var $compress = false; // memcache compression with zlib var $_connected = false; var $_memcache = false; function __construct(&$obj) { $this->hosts = $obj->memCacheHost; $this->port = $obj->memCachePort; $this->compress = $obj->memCacheCompress; } // implement as lazy connection. The connection only occurs on CacheExecute call function connect(&$err) { // do we have memcache or memcached? if (class_exists('Memcache')) { $this->library='Memcache'; $memcache = new MemCache; } elseif (class_exists('Memcached')) { $this->library='Memcached'; $memcache = new MemCached; } else { $err = 'Neither the Memcache nor Memcached PECL extensions were found!'; return false; } if (!is_array($this->hosts)) $this->hosts = array($this->hosts); $failcnt = 0; foreach($this->hosts as $host) { if (!@$memcache->addServer($host,$this->port)) { $failcnt += 1; } } if ($failcnt == sizeof($this->hosts)) { $err = 'Can\'t connect to any memcache server'; return false; } $this->_connected = true; $this->_memcache = $memcache; return true; } // returns true or false. true if successful save function writecache($filename, $contents, $debug, $secs2cache) { if (!$this->_connected) { $err = ''; if (!$this->connect($err) && $debug) ADOConnection::outp($err); } if (!$this->_memcache) return false; $failed=false; switch ($this->library) { case 'Memcache': if (!$this->_memcache->set($filename, $contents, $this->compress ? MEMCACHE_COMPRESSED : 0, $secs2cache)) { $failed=true; } break; case 'Memcached': if (!$this->_memcache->set($filename, $contents, $secs2cache)) { $failed=true; } break; default: $failed=true; break; } if($failed) { if ($debug) ADOConnection::outp(" Failed to save data at the memcache server!
\n"); return false; } return true; } // returns a recordset function readcache($filename, &$err, $secs2cache, $rsClass) { $false = false; if (!$this->_connected) $this->connect($err); if (!$this->_memcache) return $false; $rs = $this->_memcache->get($filename); if (!$rs) { $err = 'Item with such key doesn\'t exist on the memcache server.'; return $false; } // hack, should actually use _csv2rs $rs = explode("\n", $rs); unset($rs[0]); $rs = join("\n", $rs); $rs = unserialize($rs); if (! is_object($rs)) { $err = 'Unable to unserialize $rs'; return $false; } if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere $tdiff = intval($rs->timeCreated+$secs2cache - time()); if ($tdiff <= 2) { switch($tdiff) { case 2: if ((rand() & 15) == 0) { $err = "Timeout 2"; return $false; } break; case 1: if ((rand() & 3) == 0) { $err = "Timeout 1"; return $false; } break; default: $err = "Timeout 0"; return $false; } } return $rs; } function flushall($debug=false) { if (!$this->_connected) { $err = ''; if (!$this->connect($err) && $debug) ADOConnection::outp($err); } if (!$this->_memcache) return false; $del = $this->_memcache->flush(); if ($debug) if (!$del) ADOConnection::outp("flushall: failed!
\n"); else ADOConnection::outp("flushall: succeeded!
\n"); return $del; } function flushcache($filename, $debug=false) { if (!$this->_connected) { $err = ''; if (!$this->connect($err) && $debug) ADOConnection::outp($err); } if (!$this->_memcache) return false; $del = $this->_memcache->delete($filename); if ($debug) if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcache server!
\n"); else ADOConnection::outp("flushcache: $key entry flushed from memcache server!
\n"); return $del; } // not used for memcache function createdir($dir, $hash) { return true; } }