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