Coverage for Doctrine_Cache_Memcache

Back to coverage report

1 <?php
2 /*
3  *  $Id: Memcache.php 4041 2008-03-19 05:49:55Z jwage $
4  *
5  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16  *
17  * This software consists of voluntary contributions made by many individuals
18  * and is licensed under the LGPL. For more information, see
19  * <http://www.phpdoctrine.org>.
20  */
21 Doctrine::autoload('Doctrine_Cache_Driver');
22 /**
23  * Doctrine_Cache_Memcache
24  *
25  * @package     Doctrine
26  * @subpackage  Cache
27  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
28  * @link        www.phpdoctrine.org
29  * @since       1.0
30  * @version     $Revision: 4041 $
31  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
32  */
33 class Doctrine_Cache_Memcache extends Doctrine_Cache_Driver
34 {
35     /**
36      * @var Memcache $_memcache     memcache object
37      */
38     protected $_memcache = null;
39
40     /**
41      * constructor
42      * 
43      * @param array $options        associative array of cache driver options
44      */
45     public function __construct($options = array())
46     {      
47         if ( ! extension_loaded('memcache')) {
48             throw new Doctrine_Cache_Exception('In order to use Memcache driver, the memcache extension must be loaded.');
49         }
50         parent::__construct($options);
51
52         if (isset($options['servers'])) {
53             $value= $options['servers'];
54             if (isset($value['host'])) {
55                 // in this case, $value seems to be a simple associative array (one server only)
56                 $value = array(0 => $value); // let's transform it into a classical array of associative arrays
57             }
58             $this->setOption('servers', $value);
59         }
60         
61         $this->_memcache = new Memcache;
62
63         foreach ($this->_options['servers'] as $server) {
64             if ( ! array_key_exists('persistent', $server)) {
65                 $server['persistent'] = true;
66             }
67             if ( ! array_key_exists('port', $server)) {
68                 $server['port'] = 11211;
69             }
70             $this->_memcache->addServer($server['host'], $server['port'], $server['persistent']);
71         }
72     }
73
74     /**
75      * Test if a cache is available for the given id and (if yes) return it (false else)
76      *
77      * Note : return value is always "string" (unserialization is done by the core not by the backend)
78      * 
79      * @param string $id cache id
80      * @param boolean $testCacheValidity        if set to false, the cache validity won't be tested
81      * @return string cached datas (or false)
82      */
83     public function fetch($id, $testCacheValidity = true) 
84     {
85         $tmp = $this->_memcache->get($id);
86
87         if (is_array($tmp)) {
88             return $tmp[0];
89         } else if (is_string($tmp)) {
90             return $tmp;
91         }
92
93         return false;
94     }
95
96     /**
97      * Test if a cache is available or not (for the given id)
98      *
99      * @param string $id cache id
100      * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
101      */
102     public function contains($id) 
103     {
104         return (bool) $this->_memcache->get($id);
105     }
106
107     /**
108      * Save some string datas into a cache record
109      *
110      * Note : $data is always saved as a string
111      *
112      * @param string $data      data to cache
113      * @param string $id        cache id
114      * @param int $lifeTime     if != false, set a specific lifetime for this cache record (null => infinite lifeTime)
115      * @return boolean true if no problem
116      */
117     public function save($id, $data, $lifeTime = false)
118     {
119         if ($this->_options['compression']) {
120             $flag = MEMCACHE_COMPRESSED;
121         } else {
122             $flag = 0;
123         }
124
125         $result = $this->_memcache->set($id, $data, $flag, $lifeTime);
126     }
127
128     /**
129      * Remove a cache record
130      * 
131      * @param string $id cache id
132      * @return boolean true if no problem
133      */
134     public function delete($id) 
135     {
136         return $this->_memcache->delete($id);
137     }
138 }