diff --git a/cake/libs/cache/memcache.php b/cake/libs/cache/memcache.php index 760c8338428..32df6f0ab13 100644 --- a/cake/libs/cache/memcache.php +++ b/cake/libs/cache/memcache.php @@ -81,12 +81,7 @@ function init($settings = array()) { $return = false; $this->__Memcache =& new Memcache(); foreach ($this->settings['servers'] as $server) { - $parts = explode(':', $server); - $host = $parts[0]; - $port = 11211; - if (isset($parts[1])) { - $port = $parts[1]; - } + list($host, $port) = $this->_parseServerString($server); if ($this->__Memcache->addServer($host, $port)) { $return = true; } @@ -96,6 +91,31 @@ function init($settings = array()) { return true; } +/** + * Parses the server address into the host/port. Handles both IPv6 and IPv4 + * addresses + * + * @param string $server The server address string. + * @return array Array containing host, port + */ + function _parseServerString($server) { + if (substr($server, 0, 1) == '[') { + $position = strpos($server, ']:'); + if ($position !== false) { + $position++; + } + } else { + $position = strpos($server, ':'); + } + $port = 11211; + $host = $server; + if ($position !== false) { + $host = substr($server, 0, $position); + $port = substr($server, $position + 1); + } + return array($host, $port); + } + /** * Write data for key into cache. When using memcache as your cache engine * remember that the Memcache pecl extension does not support cache expiry times greater diff --git a/cake/tests/cases/libs/cache/memcache.test.php b/cake/tests/cases/libs/cache/memcache.test.php index 8eca01af66a..695416952fd 100644 --- a/cake/tests/cases/libs/cache/memcache.test.php +++ b/cake/tests/cases/libs/cache/memcache.test.php @@ -134,6 +134,24 @@ function testConnect() { $this->assertTrue($result); } +/** + * test connecting to an ipv6 server. + * + * @return void + */ + function testConnectIpv6() { + $Memcache =& new MemcacheEngine(); + $result = $Memcache->init(array( + 'prefix' => 'cake_', + 'duration' => 200, + 'engine' => 'Memcache', + 'servers' => array( + '[::1]:11211' + ) + )); + $this->assertTrue($result); + } + /** * testReadAndWriteCache method *