[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/adodb/ -> adodb-memcache.lib.inc.php (source)

   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.19  23-Apr-2014  (c) 2000-2014 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      }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1