If you're wanting to get started with Memcached on a relatively small project but need some scalability then it can make sense to allow $persistent_id to also denote both a key prefix and a server set which you define yourself. This keeps both key separation and allocation of data sets to certain server(s) incredibly simple throughout the project's life, without hampering any of your options.
<?php
$GLOBALS['memcached-sets'] = array (
'_' => array (
array('localhost', 11211)
)
);
define('DEFAULT_MEMCACHED_SET', '_');
function mcache( $persistent_id=DEFAULT_MEMCACHED_SET ) {
static $memcached_instances = array();
if( array_key_exists($persistent_id, $memcached_instances)) {
$instance = $memcached_instances[$persistent_id];
}else{
$instance = new Memcached($persistent_id);
$instance->setOption(Memcached::OPT_PREFIX_KEY, $persistent_id);
$instance->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); if( !count($instance->getServerList()) ) {
$servers = array_key_exists($persistent_id, $GLOBALS['memcached-sets'])
? $GLOBALS['memcached-sets'][$persistent_id]
: $GLOBALS['memcached-sets'][DEFAULT_MEMCACHED_SET];
$instance->addServers($servers);
}
$memcached_instances[$persistent_id] = $instance;
}
return $instance;
}
mcache()->set('foo', 'bar');
mcache('myset')->set('foo', 'baz');
var_dump(mcache()->get('foo'), mcache('myset')->get('foo'));
?>
string(3) "bar"
string(3) "baz"
Just remember to keep your $persistent_ids short as they infringe upon your maximum key length. Happy coding! :)