Skip to content

Commit f643388

Browse files
committed
Merge pull request #78 from soloweb/memcachedFix
Code clean & add SocketMemcached instead of Memcached
2 parents 7b766d2 + f0586b8 commit f643388

9 files changed

+217
-38
lines changed

core/Cache/CachePeer.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ abstract public function delete($key)
6868
6969
abstract public function isAlive()
7070
71-
Memcached <- CachePeer:
71+
SocketMemcached <- CachePeer:
7272
7373
public function __construct(
7474
$host = Memcached::DEFAULT_PORT,

core/Cache/PeclMemcache.class.php

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
<?php
2+
/***************************************************************************
3+
* Copyright (C) 2006-2008 by Konstantin V. Arkhipov *
4+
* *
5+
* This program is free software; you can redistribute it and/or modify *
6+
* it under the terms of the GNU Lesser General Public License as *
7+
* published by the Free Software Foundation; either version 3 of the *
8+
* License, or (at your option) any later version. *
9+
* *
10+
***************************************************************************/
11+
12+
/**
13+
* Connector for PECL's Memcache extension by Antony Dovgal.
14+
*
15+
* @see http://tony2001.phpclub.net/
16+
* @see http://pecl.php.net/package/memcache
17+
*
18+
* @ingroup Cache
19+
**/
20+
class PeclMemcache extends CachePeer
21+
{
22+
const DEFAULT_PORT = 11211;
23+
const DEFAULT_HOST = '127.0.0.1';
24+
25+
private $instance = null;
26+
27+
/**
28+
* @return PeclMemcache
29+
**/
30+
public static function create(
31+
$host = self::DEFAULT_HOST,
32+
$port = self::DEFAULT_PORT
33+
)
34+
{
35+
return new self($host, $port);
36+
}
37+
38+
public function __construct(
39+
$host = self::DEFAULT_HOST,
40+
$port = self::DEFAULT_PORT
41+
)
42+
{
43+
$this->instance = new Memcache();
44+
45+
try {
46+
try {
47+
$this->instance->pconnect($host, $port);
48+
} catch (BaseException $e) {
49+
$this->instance->connect($host, $port);
50+
}
51+
52+
$this->alive = true;
53+
} catch (BaseException $e) {
54+
// bad luck.
55+
}
56+
}
57+
58+
public function __destruct()
59+
{
60+
if ($this->alive) {
61+
try {
62+
$this->instance->close();
63+
} catch (BaseException $e) {
64+
// shhhh.
65+
}
66+
}
67+
}
68+
69+
/**
70+
* @return PeclMemcached
71+
**/
72+
public function clean()
73+
{
74+
try {
75+
$this->instance->flush();
76+
} catch (BaseException $e) {
77+
$this->alive = false;
78+
}
79+
80+
return parent::clean();
81+
}
82+
83+
public function increment($key, $value)
84+
{
85+
try {
86+
return $this->instance->increment($key, $value);
87+
} catch (BaseException $e) {
88+
return null;
89+
}
90+
}
91+
92+
public function decrement($key, $value)
93+
{
94+
try {
95+
return $this->instance->decrement($key, $value);
96+
} catch (BaseException $e) {
97+
return null;
98+
}
99+
}
100+
101+
public function getList($indexes)
102+
{
103+
return
104+
($return = $this->get($indexes))
105+
? $return
106+
: array();
107+
}
108+
109+
public function get($index)
110+
{
111+
try {
112+
return $this->instance->get($index);
113+
} catch (BaseException $e) {
114+
if(strpos($e->getMessage(), 'Invalid key') !== false)
115+
return null;
116+
117+
$this->alive = false;
118+
119+
return null;
120+
}
121+
122+
Assert::isUnreachable();
123+
}
124+
125+
public function delete($index)
126+
{
127+
try {
128+
// second parameter required, wrt new memcached protocol:
129+
// delete key 0 (see process_delete_command in the memcached.c)
130+
// Warning: it is workaround!
131+
return $this->instance->delete($index, 0);
132+
} catch (BaseException $e) {
133+
return $this->alive = false;
134+
}
135+
136+
Assert::isUnreachable();
137+
}
138+
139+
public function append($key, $data)
140+
{
141+
try {
142+
return $this->instance->append($key, $data);
143+
} catch (BaseException $e) {
144+
return $this->alive = false;
145+
}
146+
147+
Assert::isUnreachable();
148+
}
149+
150+
protected function store(
151+
$action, $key, $value, $expires = Cache::EXPIRES_MEDIUM
152+
)
153+
{
154+
try {
155+
return
156+
$this->instance->$action(
157+
$key,
158+
$value,
159+
$this->compress
160+
? MEMCACHE_COMPRESSED
161+
: false,
162+
$expires
163+
);
164+
} catch (BaseException $e) {
165+
return $this->alive = false;
166+
}
167+
168+
Assert::isUnreachable();
169+
}
170+
}
171+
?>

core/Cache/PeclMemcached.class.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ class PeclMemcached extends CachePeer
3434
* @return PeclMemcached
3535
**/
3636
public static function create(
37-
$host = Memcached::DEFAULT_HOST,
38-
$port = Memcached::DEFAULT_PORT,
39-
$connectTimeout = PeclMemcached::DEFAULT_TIMEOUT
37+
$host = self::DEFAULT_HOST,
38+
$port = self::DEFAULT_PORT,
39+
$connectTimeout = self::DEFAULT_TIMEOUT
4040
)
4141
{
4242
return new self($host, $port, $connectTimeout);
4343
}
4444

4545
public function __construct(
46-
$host = Memcached::DEFAULT_HOST,
47-
$port = Memcached::DEFAULT_PORT,
48-
$connectTimeout = PeclMemcached::DEFAULT_TIMEOUT
46+
$host = self::DEFAULT_HOST,
47+
$port = self::DEFAULT_PORT,
48+
$connectTimeout = self::DEFAULT_TIMEOUT
4949
)
5050
{
5151
$this->host = $host;

core/Cache/Memcached.class.php renamed to core/Cache/SocketMemcached.class.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*
2020
* @ingroup Cache
2121
**/
22-
class Memcached extends CachePeer
22+
class SocketMemcached extends CachePeer
2323
{
2424
const DEFAULT_PORT = 11211;
2525
const DEFAULT_HOST = '127.0.0.1';
@@ -29,24 +29,24 @@ class Memcached extends CachePeer
2929

3030
private $timeout = null;
3131

32-
private $buffer = Memcached::DEFAULT_BUFFER;
32+
private $buffer = self::DEFAULT_BUFFER;
3333

3434
/**
35-
* @return Memcached
35+
* @return SocketMemcached
3636
**/
3737
public static function create(
38-
$host = Memcached::DEFAULT_HOST,
39-
$port = Memcached::DEFAULT_PORT,
40-
$buffer = Memcached::DEFAULT_BUFFER
38+
$host = self::DEFAULT_HOST,
39+
$port = self::DEFAULT_PORT,
40+
$buffer = self::DEFAULT_BUFFER
4141
)
4242
{
43-
return new Memcached($host, $port, $buffer);
43+
return new self($host, $port, $buffer);
4444
}
4545

4646
public function __construct(
47-
$host = Memcached::DEFAULT_HOST,
48-
$port = Memcached::DEFAULT_PORT,
49-
$buffer = Memcached::DEFAULT_BUFFER
47+
$host = self::DEFAULT_HOST,
48+
$port = self::DEFAULT_PORT,
49+
$buffer = self::DEFAULT_BUFFER
5050
)
5151
{
5252
$errno = $errstr = null;
@@ -70,7 +70,7 @@ public function __destruct()
7070
}
7171

7272
/**
73-
* @return Memcached
73+
* @return SocketMemcached
7474
*/
7575
public function setTimeout($microseconds)
7676
{
@@ -90,7 +90,7 @@ public function setTimeout($microseconds)
9090

9191

9292
/**
93-
* @return Memcached
93+
* @return SocketMemcached
9494
**/
9595
public function clean()
9696
{

doc/ChangeLog

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
2012-05-28 Georgiy T. Kutsurua
2+
3+
* core/Cache/PeclMemcache.class.php
4+
core/Cache/PeclMemcached.class.php
5+
core/Cache/{Memcached.class.php → SocketMemcached.class.php}
6+
7+
Code clean & add SocketMemcached instead of Memcached
8+
19
2012-05-23 Georgiy T. Kutsurua
210

311
* main/Base/LightMetaProperty.class.php: fix after Enum update

doc/examples/cacheSettings.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// set up default cache peer
77

88
Cache::setPeer(
9-
Memcached::create()
9+
SocketMemcached::create()
1010
);
1111

1212
// or even several aggregated peers
@@ -15,7 +15,7 @@
1515
AggregateCache::create()->
1616
addPeer(
1717
'memcached daemon at localhost',
18-
Memcached::create()
18+
SocketMemcached::create()
1919
)->
2020
addPeer(
2121
'local low-priority file system',

test/core/AggregateCacheTest.class.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ public function testAggregateCache()
88
{
99
return $this->doTestMemcached(
1010
AggregateCache::create()->
11-
addPeer('low', Memcached::create(), AggregateCache::LEVEL_LOW)->
12-
addPeer('normal1', Memcached::create())->
13-
addPeer('normal2', Memcached::create())->
14-
addPeer('normal3', Memcached::create())->
15-
addPeer('high', Memcached::create(), AggregateCache::LEVEL_HIGH)->
11+
addPeer('low', SocketMemcached::create(), AggregateCache::LEVEL_LOW)->
12+
addPeer('normal1', SocketMemcached::create())->
13+
addPeer('normal2', SocketMemcached::create())->
14+
addPeer('normal3', SocketMemcached::create())->
15+
addPeer('high', SocketMemcached::create(), AggregateCache::LEVEL_HIGH)->
1616
setClassLevel('one', 0xb000)
1717
);
1818
}
@@ -33,11 +33,11 @@ public function testSimpleAggregateCache()
3333
{
3434
return $this->doTestMemcached(
3535
SimpleAggregateCache::create()->
36-
addPeer('low', Memcached::create(), AggregateCache::LEVEL_LOW)->
37-
addPeer('normal1', Memcached::create())->
38-
addPeer('normal2', Memcached::create())->
39-
addPeer('normal3', Memcached::create())->
40-
addPeer('high', Memcached::create(), AggregateCache::LEVEL_HIGH)->
36+
addPeer('low', SocketMemcached::create(), AggregateCache::LEVEL_LOW)->
37+
addPeer('normal1', SocketMemcached::create())->
38+
addPeer('normal2', SocketMemcached::create())->
39+
addPeer('normal3', SocketMemcached::create())->
40+
addPeer('high', SocketMemcached::create(), AggregateCache::LEVEL_HIGH)->
4141
setClassLevel('one', 0xb000)
4242
);
4343
}
@@ -47,7 +47,7 @@ public function testCyclicAggregateCache()
4747
$this->doTestMemcached(
4848
CyclicAggregateCache::create()->
4949
setSummaryWeight(42)->
50-
addPeer('first', Memcached::create(), 25)->
50+
addPeer('first', SocketMemcached::create(), 25)->
5151
addPeer('second', PeclMemcached::create(), 1)->
5252
addPeer('third', PeclMemcached::create(), 13)
5353
);

test/core/BaseCachesTest.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ final class BaseCachesTest extends TestCase
55
public static function cacheProvider()
66
{
77
return array(
8-
// array(Memcached::create()),
8+
// array(SocketMemcached::create()),
99
// array(SharedMemory::create()),
1010
// array(PeclMemcached::create()),
1111
array(RuntimeMemory::create()),
@@ -61,7 +61,7 @@ public function testWrongKeys(CachePeer $cache)
6161
public function testWithTimeout()
6262
{
6363
$cache =
64-
Memcached::create('localhost')->
64+
SocketMemcached::create('localhost')->
6565
setTimeout(200);
6666

6767
$cache->add('a', 'b');

test/core/SequentialCacheTest.class.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function testMultiCacheAliveLast()
1616
$alifePeer = new PeclMemcached("127.0.0.1", "11211"); //some existing memcached
1717
$alifePeer->set('some_key', 'some_value');
1818

19-
$deadPeer = new Memcached("165.42.42.42", "11211"); //some not existing memcache
19+
$deadPeer = new SocketMemcached("165.42.42.42", "11211"); //some not existing memcache
2020

2121
$slave1 = new PeclMemcached("35.143.65.241", "11211"); //some not existing memcache
2222

@@ -34,7 +34,7 @@ public function testMultiCacheAliveLast()
3434

3535
public function testMultiCacheAliveFirst()
3636
{
37-
$alifePeer = new Memcached("127.0.0.1", "11211"); //some existing memcached
37+
$alifePeer = new SocketMemcached("127.0.0.1", "11211"); //some existing memcached
3838
$alifePeer->set('some_key', 'some_value');
3939

4040
$slave1 = new PeclMemcached("35.143.65.241", "11211"); //some not existing memcache
@@ -54,7 +54,7 @@ public function testMultiCacheAliveOnly()
5454
CyclicAggregateCache::create()-> //some existing memcached
5555
setSummaryWeight(42)->
5656
addPeer('first', new PeclMemcached("127.0.0.1", "11211"), 0)->
57-
addPeer('second', new Memcached("127.0.0.1", "11211"), 21);
57+
addPeer('second', new SocketMemcached("127.0.0.1", "11211"), 21);
5858

5959
$alifePeer->set('some_key', 'some_value');
6060

@@ -77,4 +77,4 @@ public function testMultiCacheNoAlive()
7777

7878
$result = $cache->get("some_key"); //will throw RuntimeException
7979
}
80-
}
80+
}

0 commit comments

Comments
 (0)