A. php无法加载memcache模块
你的php的mencached扩展的版本是当前php版本可使用的不
B. memcached缓存错误
安装以后,启动服务,memcached开始运行,php中memcached的扩展是用来php连接memcached用的,就像是mysql扩展是php连接mysql用,memcached主要作用是缓存mysql数据库的,需要在php中定义访问memcached,如果没有数据,php去访问mysql,然后通过php代码告诉memcached你给我缓存数据。我理解的就是这样,我不是开发,是运维。
C. 小白谈memcache和memcached的区别
两个昌卜不同版本的php的memcached的客户端
new memcache是pecl扩展库版本
new memcached是libmemcached版本
完成了,其实2个可以理解成2个扩展历史原因也不想多说了,就是尽量使用memcached就好了,不过也会出现一些很奇怪的Bug,比如使用拦改memcached扩展的适合设置的session(session存放到memcached中,使用的是memcached扩展存简迅判放的就会发现不会过期)。
在实践中用了之后才会知道什么和什么的,动手是最好的学习方式.
D. 小白谈memcache和memcached的区别
两个指友模唯缓不同版本的php的memcached的客户端
new memcache是pecl扩告顷展库版本
new memcached是libmemcached版本
E. php中memcached怎么存多维数组
PHP的Memcached的驱动会自动进行serialize和unserialize,你所需要做的是:
1.
选取一个合适key,比如
"POST_OF_USER_"
.
$userId
2.
调用set函数把数据丢进去就行了
示例代码:
全选复制放进笔记//
0.
准备:
$cache
=
new
Memcache();
$cache->connect('127.0.0.1',
11211);
//
请替换为你的memcache服务器地址和端口
$userId
=
//
你自己想办法获取...
//
1.
构造cache
KEY
$cacheKey
=
"POSTS_OF_USER_"
.
$userId;
//
2.
从缓存中获取数据
$posts
=
$cache->get($cacheKey);
if
($posts
===
false){
//
3.
缓存失效了,加载数据
$posts
=
//
你自己想办法加载数据
//
4.
保存数据到缓存中
$cache->set($cacheKey,
$posts);
}
//
OK,可以使用posts了
F. memcached已经安装,调试程序提示Fatal error: Class 'Memcached' not found in
代码测试是否安装雹棚:
$mem=newMemcache;
$mem->connect("127.0.0.1",11211);
$mem->set('key','Thisisatest!',0,60);
$val=$mem->get('key');
(6)phpnewmemcached扩展阅读:
使用注意事项:
memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。
由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像仔大是后端的数据库)需要额外的程式码更新memcached内的资源戚则料。
G. memcache各种数据类型的存储
<?php
//创建一个memcache对象
$memcache = new Memcache;
//连接Memcached服务器
$memcache->connect('localhost', 11211) or die ("Could not connect");
/指颤/设置一个变量到内存中,名液逗滑称是key 值闹腊是test
$memcache->set('age',20,0) ;//整型
$memcache->set('name','周行知',0) ;//字符串
$memcache->set('sex',true,0) ;//布尔型
$memcache->set('pai',3.1415926);//浮点型
?>
<?php
//创建一个memcache对象
$memcache = new Memcache;
//连接Memcached服务器
$memcache->connect('localhost', 11211) or die ("Could not connect");
//从内存中取出key的值
var_mp($memcache->get('name'));
var_mp($memcache->get('age'));
var_mp($memcache->get('sex'));
var_mp($memcache->get('pai'));
?>
输出结果如图所示:
memcache复合类型的例子:
例9
<?php
//创建一个memcache对象
$memcache = new Memcache;
//连接Memcached服务器
$memcache->connect('localhost', 11211) or die ("Could not connect");
//设置一个变量到内存中,名称是key 值是test
$city=array("hunan"=>'湖南',"beijing"=>"北京", "chongqing"=>"重庆" );
class Person{
var $name="jim";
var $height=170;
function run(){
echo "周行知";
}
}
$per=new Person();
$memcache->set('arr',$city,0) ;//数组
$memcache->set('obj',$per,0) ;//obj
$memcache->set('kong',null,0);//null
?>
例10
<?php
//创建一个memcache对象
$memcache = new Memcache;
//连接Memcached服务器
$memcache->connect('localhost', 11211) or die ("Could not connect");
//从内存中取出key的值
var_mp($memcache->get('arr'));
var_mp($memcache->get('obj'));
var_mp($memcache->get('kong'));
?>
输出结果:
H. Memcache如何安装
1、将下载的memcached.exe文件放到磁盘固定的地方,不要删除。打开开始菜单,在输入框里输入cmd按回车。
I. windows下网站怎么开启memcache
windows下网站开启memcache的方法是设置调用方法:
Memcached 是memcache的运行服务端,核心文件,Memcached基于一个存储键/值对的hashmap,其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
作用:Memcached基本只占用内存资源。能够很好弥补对于高频繁调用,却不经常变更的资源。
web中的memcache的实现方法:
/**
* 缓存类
*/
public class MemCachedCtl {
protected static MemCachedClient mcc = new MemCachedClient();// 创建全局的唯一实例
protected static MemCachedCtl memCached = new MemCachedCtl();
//配置信息
private static String[] servers = { "127.0.0.1:11211" };
private static Integer[] weights = { 3 };
private static int initialConnections = 10;
private static int minSpareConnections = 5;
private static int maxSpareConnections = 50;
private static long maxIdleTime = 1000 * 60 * 30;
private static long maxBusyTime = 1000 * 60 * 5;
private static long maintThreadSleep = 1000 * 5;
private static int socketTimeOut = 1000 * 3;
private static boolean nagleAlg = false;
/**
* 不允许通过构造方法创建实例
*/
protected MemCachedCtl() {
}
/**
* 获取唯一实例.
*/
public static MemCachedCtl getInstance() {
return memCached;
}
/**
* 初始化基本信息
*/
public void init(){
if(initConfig())
initPool();
}
/**
* 初始化配置信息
*/
private boolean initConfig(){
//TODO 初始化配置文件
return true;
}
/**
* memcache服务器初始化连接池
*/
private void initPool(){
SockIOPool pool = SockIOPool.getInstance();// 获取socke连接池的实例对象
pool.setServers(servers);// 设置服务器信息
pool.setWeights(weights);//设置权重
pool.setInitConn( initialConnections );// 设置初始连接数
pool.setMinConn( minSpareConnections );//设置最小连接数
pool.setMaxConn( maxSpareConnections );//设置最大连接数
pool.setMaxIdle( maxIdleTime );//设置最大处理时间
pool.setMaxBusyTime( maxBusyTime );
pool.setMaintSleep( maintThreadSleep );// 设置主线程的等待时间
pool.setSocketTO( socketTimeOut ); //设置连接超时时间
pool.setNagle( nagleAlg );
pool.setHashingAlg( SockIOPool.NEW_COMPAT_HASH );
pool.setAliveCheck( true );
pool.initialize();
}
/**
* 判断key是否存在
*/
public boolean keyExists(String key){
return mcc.keyExists(key);
}
/**
* 缓存一个对象
*/
public synchronized boolean add(String key, Object value) {
return mcc.add(key, value);
}
/**
* 缓存一个对象(日期)
*/
public synchronized boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
/**
* 缓存一个对象(hashCode码)
*/
public synchronized boolean add(String key,Object value,Integer hashCode){
return mcc.add(key, value, hashCode);
}
/**
* 缓存一个对象
*/
public synchronized boolean set(String key, Object value) {
return mcc.set(key, value);
}
/**
* 缓存一个对象(日期)
*/
public synchronized boolean set(String key, Object value, Date expiry) {
return mcc.set(key, value, expiry);
}
/**
* 缓存一个对象(hashCode码)
*/
public synchronized boolean set(String key,Object value,Integer hashCode){
return mcc.set(key, value, hashCode);
}
/**
* 删除一个缓存对象
*/
public synchronized boolean delete(String key) {
return mcc.delete(key);
}
/**
* 删除一个缓存对象(日期)
*/
public synchronized boolean delete(String key, Object value, Date expiry) {
return mcc.delete(key, expiry);
}
/**
* 删除一个缓存对象(hashCode码)
*/
public synchronized boolean delete(String key,Integer hashCode,Date expiry){
return mcc.delete(key, hashCode, expiry);
}
/**
* 删除全部服务器上的缓存对象
*/
public synchronized boolean flushAll() {
return mcc.flushAll();
}
/**
* 删除指定服务器上的缓存对象
*/
public synchronized boolean flushAll(String[] servers) {
return mcc.flushAll(servers);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value, Integer hashCode) {
return mcc.replace(key, value, hashCode);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value,Date expiry, Integer hashCode){
return mcc.replace(key, value, expiry, hashCode);
}
/**
* 返回全部服务器状态
*/
public Map stats(){
return mcc.stats();
}
/**
* 返回指定服务器状态
*/
public Map stats(String[] servers){
return mcc.stats(servers);
}
/**
* 根据指定KEY获得缓存
*/
public Object get(String key) {
return mcc.get(key);
}
/**
* 根据指定KEY,HASHCODE获得缓存
*/
public Object get(String key,Integer hashCode) {
return mcc.get(key,hashCode);
}
/**
* 根据指定KEY,HASHCODE,状态值 获得缓存
*/
public Object get(String key,Integer hashCode,boolean asString) {
return mcc.get(key,hashCode,asString);
}
/**
* 测试方法
* 这里真实调用的时候换成自己的场景使用。
*/
public static void main(String[] args) {
MemCachedCtl cache = MemCachedCtl.getInstance();
cache.init();
// cache.add("helloworld_key", "helloworld_value");
cache.set("helloworld_key", "helloworld_value");
System.out.print("返回结果: " + cache.get("helloworld_key"));
}
}
J. 使用php Memcache模块如何正确遍历所有KEY以及VALUE
在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历所有Memcached服务器上的key,但是并不保证原子操作,而后者却没有提供任何方法,虽然在PHP官方
文档中有人给出使用方法getExtendedStats来间接获取Memcached服务器上的所有key,但是给出的代码是有不少坑的,如果拿来就用,对于cluster的memcached服务器而言,有些问题就需要指出来。
下面将给出官方文档中的代码,并指出可能面临的问题,代码如下:
<?php
/**
*Functiontogetallmemcachekeys
*@authorManishPatel
*@Created:28-May-2010
*/
functiongetMemcacheKeys(){
$memcache=newMemcache;
$memcache->connect('127.0.0.1',11211)ordie("");
$list=array();
$allSlabs=$memcache->getExtendedStats('slabs');
$items=$memcache->getExtendedStats('items');
foreach($allSlabsas$server=>$slabs){
foreach($slabsAS$slabId=>$slabMeta){
$cmp=$memcache->getExtendedStats('cachemp',(int)$slabId);
foreach($cmpAS$keys=>$arrVal){
foreach($arrValAS$k=>$v){
echo$k."<br>";
}
}
}
}//EOgetMemcacheKeys()?>
在上述代码中,如果用于获取单个memcached服务器上的key,是不存在任何问题,但是获取连接池中的多个memcached所有key就存在问题,会发现打印出重复的key,问题就在于当使用getExtendedStats用去特定$slabID
上的信息时,返回的是连接池中所有的服务器上的特定$slabId的存储的keys信息。当$server为"127.0.0.1:11214"且$slabId为0将变量$cmp的信息打印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}
当$server为"127.0.0.1:11216"且$slabId为0将变量$cmp的信息打印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}