Heim  >  Artikel  >  Backend-Entwicklung  >  php操作memcache的单例模式并测试其机制

php操作memcache的单例模式并测试其机制

WBOY
WBOYOriginal
2016-07-29 09:08:511636Durchsuche

class MemcacheOpr extends Memcached
{
    
    private static $instance = null;
    private static $host = '127.0.0.1';
    private static $port = 11211;
    public static function getInstance()
    {
        if (!(self::$instance instanceof Memcached)) {
            self::$instance = new Memcached();
            self::$instance->addServer(self::$host, self::$port);
        }
        return self::$instance;
    }
}
ini_set('memory_limit','1024M');//这里要注意,当前页面的最大使用内存默认是128M,超过的话就必须重新设置
ini_set('max_execution_time',60);   //php页面的最大执行时间,这里默认值是30s,如果超过也需要重新设置
$mcache = MemcacheOpr::getInstance();//单例模式调用
$mcache->flush();               //先全部清除
$mcache->delete('string1m');
$mcache->delete('string2m');
$mcache->delete('string3m');
$mcache->delete('string4m');
$mcache->delete('string5m');
for($i=0;$i    $mcache->delete('string'.$i);
}
/*$mcache->set('somewords','have you learned some thing?');
$output = $mcache->get('somewords');
echo "output=[$output]
";*/
$begintime = microtime(TRUE);
$input = str_repeat('what',1024*1024*16*2*1.5);  //192M
$input = substr($input,0,-512);
$mcache->set('string1m',$input);//192M 为什么存入192M的5条内容都能成功呢?就是因为memcached对存入内存的东西开启了压缩
$mcache->set('string2m',$input.'areyou2');
$mcache->set('string3m',$input.'areyou3');
$mcache->set('string4m',$input.'areyou4');
$mcache->set('string5m',$input.'areyou5');
/*for($i=0;$i    $mcache->set('string'.$i, $input);
}*/
$input = str_repeat('what',1048576); //这里实际上存入了4M的东西,因为memcached开启了压缩,所以实际存入的内容很少才会没有问题。
for($i=0;$i    $mcache->set('string'.$i,$input);
}
$mcache->delete('somewords');
$during = microtime(TRUE) - $begintime;
echo 'total time:'.$during.'s
';
file_put_contents('/tmp/string5m.log',$mcache->get('string1m'));
//echo 'length of $output is:'.strlen($output).",output=[$output]
";
/*$allKeys = $mcache->getAllKeys();
var_dump($allKeys);

print_r($mcache->getStats());*/

php操作memcache的单例模式并测试其机制

其实从phpinfo()中我们可以看到针对保存内容超过2000字节的内容,memcached会开启压缩

针对php数组,memcache会序列化,所以保存的内容长度可以与实际内容长度不相同。

如果想看服务器上的memcache使用状态,可以通过 telnet 127.0.0.1 11211命令来查看

获取实际存储的值: get string1m

通过 stats命令来显示其中的一些状态,比如内存命中情况

通过 stats slabs 来显示不同的slab块的实际情况

实际上默认每页(page)保存1m的内容,然后这1m的内容可以按照chunksize的大小等分成很多块,这些块就是slab块

当保存的内容长度相同时,一般会使用相同大小的块,超过该长度1.25倍(默认的递增倍数)的时候,会启用新的slab块。

递增倍数越大,内存浪费的越厉害,如果8k的slab块已经用完了,你又想继续保存8k的数据,那就会使用10k的数据(默认情况下),实际上已经浪费了2k的内存数据了;

如果递增倍数为2,那将浪费8k的内存。

以上就介绍了php操作memcache的单例模式并测试其机制,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn