diff --git a/src/DependencyInjection/Builder/ServiceBuilder.php b/src/DependencyInjection/Builder/ServiceBuilder.php index bb993eb..9b29294 100755 --- a/src/DependencyInjection/Builder/ServiceBuilder.php +++ b/src/DependencyInjection/Builder/ServiceBuilder.php @@ -157,6 +157,22 @@ public function createCacheInstance(Definition $service, $type, $id, array $inst if (empty($instance['id'])) { $cache = new Definition(self::$types[$type]['class']); + // set memcached options first as they need to be set before the servers are added. + if ($type === 'memcached') { + if (!empty($instance['options']['memcached'])) { + foreach ($instance['options']['memcached'] as $option => $value) { + switch ($option) { + case 'serializer': + case 'hash': + case 'distribution': + $value = constant(sprintf('\Memcached::%s_%s', strtoupper($option), strtoupper($value))); + break; + } + $cache->addMethodCall('setOption', array(constant(sprintf('\Memcached::OPT_%s', strtoupper($option))), $value)); + } + } + } + if (isset($instance['persistent']) && $instance['persistent'] !== false) { if ($instance['persistent'] !== true) { $persistentId = $instance['persistent']; diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 08c2747..369dfc3 100755 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -87,13 +87,13 @@ private function getClustersNode() ->defaultNull() ->beforeNormalization() ->ifTrue( - function($v) { - return $v === 'true' || $v === 'false'; + function ($v) { + return $v === 'true' || $v === 'false'; } ) ->then( - function($v) { - return (bool) $v; + function ($v) { + return (bool) $v; } ) ->end() @@ -112,6 +112,9 @@ function($v) { ->end() ->arrayNode('options') ->info("Options for Redis and Memcached.") + ->children() + ->append($this->getMemcachedOptions()) + ->end() ->end() ->arrayNode('hosts') ->prototype('array') @@ -164,6 +167,64 @@ function ($v) { return $node; } + /** + * @return ArrayNodeDefinition + */ + private function getMemcachedOptions() + { + $treeBuilder = new TreeBuilder(); + $node = $treeBuilder->root('memcached'); + + if (class_exists('\Memcached')) { + $node + ->children() + ->booleanNode('compression') + ->end() + ->enumNode('serializer') + ->values(array('php', 'igbinary', 'json')) + ->end() + ->scalarNode('prefix_key') + ->end() + ->enumNode('hash') + ->values(array('default', 'md5', 'crc', 'fnv1_64', 'fnv1a_64', 'fnv1_32', 'fnv1a_32', 'hsieh', 'murmur')) + ->end() + ->enumNode('distribution') + ->values(array('modula', 'consistent')) + ->end() + ->booleanNode('libketama_compatible') + ->end() + ->booleanNode('uffer_writes') + ->end() + ->booleanNode('binary_protocol') + ->end() + ->booleanNode('no_block') + ->end() + ->booleanNode('tcp_nodelay') + ->end() + ->integerNode('socket_send_size') + ->end() + ->integerNode('socket_recv_size') + ->end() + ->integerNode('connect_timeout') + ->end() + ->integerNode('retry_timeout') + ->end() + ->integerNode('send_timeout') + ->end() + ->integerNode('recv_timeout') + ->end() + ->integerNode('poll_timeout') + ->end() + ->booleanNode('cache_lookups') + ->end() + ->integerNode('server_failure_limit') + ->end() + ->end(); + } + + return $node; + } + /** * Configure the "aequasi_cache.session" section *