搜尋
首頁後端開發php教程PHP中的Memcache详解_PHP教程

PHP中的Memcache详解_PHP教程

Jul 13, 2016 am 10:34 AM
memcachephp主要開始文章簡介詳細詳解

 这篇文章主要介绍了PHP中的Memcache,从Memcache简介开始,详细讲解了如Memcache和memcached的区别、PHP的Memcache所有操作方法、每个操作方法的详细解释等,需要的朋友可以参考下

一、Memcache简介 

Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached管理这些HashTable,所以速度非常快。 

 

二、Memcache和memcached的区别 

 

为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。 

 

三、Memcache的服务器端和客户端安装 

 

分为两个过程:memcache服务器端的安装和memcached客户端的安装。 

 

所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储。 

 

所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。 

 

四、PHP的Memcache客户端所有方法总结 

 

memcache函数所有的方法列表如下: 

Memcache::add – 添加一个值,如果已经存在,则返回false 

Memcache::addServer – 添加一个可供使用的服务器地址 

Memcache::close – 关闭一个Memcache对象 

Memcache::connect – 创建一个Memcache对象 

memcache_debug – 控制调试功能 

Memcache::decrement – 对保存的某个key中的值进行减法操作 

Memcache::delete – 删除一个key值 

Memcache::flush – 清除所有缓存的数据 

Memcache::get – 获取一个key值 

Memcache::getExtendedStats – 获取进程池中所有进程的运行系统统计 

Memcache::getServerStatus – 获取运行服务器的参数 

Memcache::getStats – 返回服务器的一些运行统计信息 

Memcache::getVersion – 返回运行的Memcache的版本信息 

Memcache::increment – 对保存的某个key中的值进行加法操作 

Memcache::pconnect – 创建一个Memcache的持久连接对象 

Memcache::replace -对一个已有的key进行覆写操作 

Memcache::set – 添加一个值,如果已经存在,则覆写 

Memcache::setCompressThreshold – 对大于某一大小的数据进行压缩 

Memcache::setServerParams – 在运行时修改服务器的参数 

 

五、PHP的Memcache操作方法分解 

 

Memcache::add用法 

代码如下:bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

 

说明: 

如果$key不存在的时候,使用这个函数来存储$var的值。功能相同的函数是memcache_add()。 

 

参数: 

$key :将要存储的键值。 

$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。 

$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。 

$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。如果$key值已经存在,则会返回FALSE。 其他情况下Memcache::add()的用法类似于Memcache::set()。 

例子: 

 

 代码如下:

$memcache_obj = memcache_connect(”localhost”, 11211); 

memcache_add($memcache_obj, 'var_key', 'test variable', false, 30); 

$memcache_obj->add('var_key', 'test variable', false, 30); 

?>

 

 

Memcache::addServer用法 

代码如下:bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int$timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )

 

说明: 

添加一个可供使用的服务器地址到连接池中,连接用Memcache::addServer打开,脚本执行完后自动关闭,或者可以用Memcache::close()手动关闭。相同函数是memcache_add_server()。 

当用这个方法的时候(相对于Memcache::connect()和 Memcache::pconnect()方法),网络连接只有等需要的时候才会建立,因此不会因为增加很多的服务器到连接池而增加系统负担,因为很多服务器可能没有使用。 

故障恢复会发生在这个方法执行的任何阶段,只要其他的服务器是正常的,这些连接请求的失败用户不会注意到。任何一种socket或者memcached服务器级的错误可以触发故障恢复。正常的客户端错误比如增加一个存在的键值不会引发故障恢复。 

 

参数: 

$host服务器的地址 

$port服务器端口 

$persistent是否是一个持久连接 

$weight这台服务器在所有服务器中所占的权重 

$timeout连接的持续时间 

$retry_interval连接重试的间隔时间,默认为15,设置为-1表示不进行重试 

$status控制服务器的在线状态 

$failure_callback允许设置一个回掉函数来处理错误信息。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

代码如下:

$memcache = new Memcache; 

$memcache->addServer('memcache_host', 11211); 

$memcache->addServer('memcache_host2′, 11211); 

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

memcache_add_server($memcache_obj, 'memcache_host2′, 11211); 

?> 

 

 

Memcache::close用法 

 

bool Memcache::close ( void ) 

 

说明: 

关闭memcache服务器连接。这个函数不会关闭长连接,长连接只有在web服务器关闭或者重启的时候才会关闭。相同的函数memcache_close() 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

例子: 

 

 代码如下:

$memcache_obj = memcache_connect('memcache_host', 11211); 

memcache_close($memcache_obj); 

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

$memcache_obj->close(); 

?> 

 

 

Memcache::connect用法 

 代码如下:bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )

 

说明: 

打开memcached服务器连接,建立一个到memcached服务器的连接,用Memcache::connect打开的连接会在脚本执行完毕后自动关闭。你也可以用Memcache::close()去关闭连接。相同的函数是memcache_connect()。 

参数: 

$host:指向memcached正在收听的链接的主机,这个参数会有另一种特殊的连接方式unix:///path/to/memcached.sock,即用unix的域名sockets,这种情况下,端口必须设置为0 

$port:指向memcached正在收听的链接的端口,用unix的域名sockets的情况下,端口必须设置为0 

$timeout:用于连接守护进程的秒数,当你改变默认的1秒的值的时候,你需要考虑一下,如果你的连接太慢的话,你可能会失去缓存的优势。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

例子: 

 代码如下:

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

$memcache = new Memcache; 

$memcache->connect('memcache_host', 11211); 

 

?> 

 

 

memcache::debug 

 

 代码如下:bool memcache_debug ( bool $on_off )

 

说明: 

控制调试功能,前提是php在编译的时候使用了-enable-debug选项,否则这个函数不会有作用。 

参数: 

$on_off:true表示开启调试,false表示关闭调试 

返回值: 

如果php在编译的时候使用了-enable-debug选项,返回true,否则返回false 

 

Memcache::decrement用法 

代码如下:int Memcache::decrement ( string $key [, int $value ] )

 

说明: 

Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作,用法跟Memcache::increment类似。 

你也可以用memcache_decrement()函数。 

参数: 

Key:想要减少的键的名字 

Value:想要减少的值。 

 

返回值: 

如果成功,返回被减少后的值,如果失败返回false。 

例子: 

 

 代码如下:

$memcache = new Memcache; 

$memcache->connect('localhost', 11211); 

$memcache->set('test_item', 8); 

$memcache->increment('test_item', 4); 

echo $memcache->decrement('test_item', 7); 

// 显示 5 

?> 

 

 

这个例子连Memcache::increment函数都一块演示了。 

 

Memcache::delete用法 

 

代码如下:bool Memcache::delete ( string $key [, int $timeout ] )

 

说明: 

删除一个key值,如果参数$timeout被设置,那么存储的值会在设置的秒数以后过期,你也可以用函数memcache_delete() 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

 代码如下:

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

 

memcache_delete($memcache_obj, 'key_to_delete', 10); 

 

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

$memcache_obj->delete('key_to_delete', 10); 

 

?> 

 

 

Memcache::flush 

代码如下:bool Memcache::flush ( void )

 

说明: 

清除所有缓存的数据。Memcache::flush实际上没有释放资源,它仅仅将所有的缓存标记为过期,这样可以使新的缓存来覆盖被占的内存空间。一样的函数是memcache_flush() 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

 

 代码如下:

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

 

memcache_flush($memcache_obj); 

 

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

 

$memcache_obj->flush(); 

 

?> 

 

 

Memcache::get 

 

 代码如下:

string Memcache::get ( string $key [, int &$flags ] ) 

 

array Memcache::get ( array $keys [, array &$flags ] )

 

说明: 

方法的作用是获取一个key值,key值可以是一个数组,结果会包含键值对。 

 

参数: 

$key是键值或者一个键的数组值。 

$flags如果这个参数存在,那么$flags跟写入这个参数的值相关,这些$flags 类似于Memcache::set()函数里的$flags。 

 

返回值: 

如果成功,则返回key对应的值,如果失败则返回false. 

例子: 

 代码如下:

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

$var = memcache_get($memcache_obj, 'some_key'); 

 

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

$var = $memcache_obj->get('some_key'); 

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

$var = memcache_get($memcache_obj, Array('some_key', 'another_key')); 

 

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

$var = $memcache_obj->get(Array('some_key', 'second_key')); 

 

?> 

 

 

Memcache::getExtendedStats 

代码如下:array Memcache::getExtendedStats ([ string $type [, int $slabid [, int $limit ]]] )

 

说明: 

获取进程池中所有进程的运行系统统计。相同函数是memcache_get_extended_stats() 

 

参数: 

$type表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes; 

$slabid第一个参数设置为”cachedump”时使用的。 

$limit第一个参数设置为”cachedump”时使用的。 

返回值: 

如果成功,返回统计信息,失败会返回false 

 

例子: 

 代码如下:

$memcache_obj = new Memcache; 

$memcache_obj->addServer('memcache_host', 11211); 

$memcache_obj->addServer('failed_host', 11211); 

 

$stats = $memcache_obj->getExtendedStats(); 

//slabs机制分配管理内存的情况 

$statsslab = $memcache_obj->getExtendedStats(slabs); 

 

?> 

 

 

 

Memcache::getServerStatus 

 

代码如下:int Memcache::getServerStatus ( string $host [, int $port ] )

 

说明: 

获取运行服务器的参数。返回一个服务器在线或者离线的状态。相同的函数是memcache_get_server_status() 

 

参数: 

$host:正在收听的连接的主机 

$port正在收听的连接的主机的端口,默认是11211 

 

返回值: 

成功返回服务器状态,服务器没有启动会返回0,其他数字的时候表示服务器是启动状态的。 

 

例子: 

 代码如下:

$memcache = new Memcache; 

$memcache->addServer('memcache_host', 11211); 

echo $memcache->getServerStatus('memcache_host', 11211); 

 

$memcache = memcache_connect('memcache_host', 11211); 

echo memcache_get_server_status($memcache, 'memcache_host', 11211); 

 

?> 

 

 

Memcache::getStats 

 

 代码如下:array Memcache::getStats ([ string $type [, int $slabid [, int $limit ]]] )

 

说明: 

返回服务器的一些运行统计信息。相同的函数是memcache_get_stats() 

 

参数: 

$type表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes; 

$slabid第一个参数设置为”cachedump”时使用的。 

$limit第一个参数设置为”cachedump”时使用的。 

 

Memcache::getVersion 

代码如下:string Memcache::getVersion ( void )

 

说明: 

返回运行的Memcache的版本信息。相同函数memcache_get_version() 

 

返回值: 

成功返回服务器的版本信息,失败的时候返回false。 

 

例子: 

 代码如下:

$memcache = new Memcache; 

$memcache->connect('memcache_host', 11211); 

echo $memcache->getVersion(); 

 

$memcache = memcache_connect('memcache_host', 11211); 

echo memcache_get_version($memcache); 

?> 

 

 

 

Memcache::increment 

 

 代码如下:int Memcache::increment ( string $key [, int $value ] )

 

对保存的某个key中的值进行加法操作 

用法参考Memcache::decrement 

 

 

Memcache::pconnect 

 

 代码如下:bool Memcache::pconnect ( string $host [, int $port [, int $timeout ]] )

 

说明: 

创建一个Memcache的持久连接对象 

用法与Memcache::connect()相似,不同点地方是Memcache::pconnect是建立的持久连接。这个连接在脚本执行完或者Memcache::close()函数运行也不会被关闭。与它相同的函数是memcache_pconnect() 

 

参数: 

$host:指向memcached正在收听的链接的主机,这个参数会有另一种特殊的连接方式unix:///path/to/memcached.sock,即用unix的域名sockets,这种情况下,端口必须设置为0 

$port:指向memcached正在收听的链接的端口,用unix的域名sockets的情况下,端口必须设置为0 

$timeout:用于连接守护进程的秒数,当你改变默认的1秒的值的时候,你需要考虑一下,如果你的连接太慢的话,你可能会失去缓存的优势。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE 

 代码如下:

 

$memcache_obj = memcache_pconnect('memcache_host', 11211); 

 

$memcache_obj = new Memcache; 

$memcache_obj->pconnect('memcache_host', 11211); 

 

?> 

 

 

Memcache::replace 

 代码如下:bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )

 

说明: 

对一个已有的key进行覆写操作。相同函数是memcache_replace() 

 

参数: 

$key :将要存储的键值。 

$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。 

$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。 

$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。如果$key值已经存在,则会返回FALSE。 

 代码如下:

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

memcache_replace($memcache_obj, "test_key", "some variable", false, 30); 

$memcache_obj->replace("test_key", "some variable", false, 30); 

 

?> 

 

 

 

Memcache::set 

 代码如下:bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )

 

说明: 

添加一个值,如果已经存在,则覆写。相同函数是memcache_set() 

 

参数: 

$key :将要存储的键值。 

$var :存储的值,字符型和整型会按原值保存,其他类型自动序列化以后保存。 

$flag:是否用MEMCACHE_COMPRESSED来压缩存储的值,true表示压缩,false表示不压缩。 

$expire:存储值的过期时间,如果为0表示不会过期,你可以用unix时间戳或者描述来表示从现在开始的时间,但是你在使用秒数表示的时候,不要超过2592000秒 (表示30天)。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

 

代码如下:

$memcache_obj = new Memcache; 

$memcache_obj->connect('memcache_host', 11211); 

$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50); 

echo $memcache_obj->get('var_key'); 

 

 

Memcache::setCompressThreshold 

 代码如下:bool Memcache::setCompressThreshold ( int $threshold [, float $min_savings ] )

 

说明: 

对大于某一大小的数据进行压缩。相同的函数是memcache_set_compress_threshold() 

 

参数: 

setCompressThreshold方法有两个参数,第一个参数表示处理数据大小的临界点,第二个参数表示压缩的比例,默认为0.2。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

 代码如下:

 

$memcache_obj = new Memcache; 

$memcache_obj->addServer('memcache_host', 11211); 

$memcache_obj->setCompressThreshold(20000, 0.2); 

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

memcache_set_compress_threshold($memcache_obj, 20000, 0.2); 

 

?> 

 

 

 

Memcache::setServerParams 

 

复制代码 代码如下:bool Memcache::setServerParams ( string $host [, int $port [, int $timeout [, int$retry_interval [, bool $status [, callback $failure_callback ]]]]] )

 

说明: 

在运行时修改服务器的参数。相同函数是memcache_set_server_params()。 

 

参数: 

$host服务器的地址 

$port服务器端口 

$timeout连接的持续时间 

$retry_interval连接重试的间隔时间,默认为15,设置为-1表示不进行重试 

$status控制服务器的在线状态 

$failure_callback允许设置一个回掉函数来处理错误信息。 

 

返回值: 

如果成功则返回 TRUE,失败则返回 FALSE。 

 

例子: 

 代码如下:

 

function _callback_memcache_failure($host, $port) { 

print "memcache '$host:$port' failed"; 

 

$memcache = new Memcache; 

 

// 离线模式增加一个服务器 

$memcache->addServer('memcache_host', 11211, false, 1, 1, -1, false); 

 

// 把服务器设成在线 

$memcache->setServerParams('memcache_host', 11211, 1, 15, true, '_callback_memcache_failure'); 

 

$memcache_obj = memcache_connect('memcache_host', 11211); 

memcache_set_server_params($memcache_obj, 'memcache_host', 11211, 1, 15, true, '_callback_memcache_failure'); 

 

?> 

 

 

六、综合使用实例 

 代码如下:

//连接 

$mem = new Memcache; 

$mem->connect("db.nowamagic.net", 12000); 

//保存数据 

$mem->set('key1', 'This is first value', 0, 60); 

$val = $mem->get('key1'); 

echo "Get key1 value: " . $val ."
"; 

//替换数据 

$mem->replace('key1', 'This is replace value', 0, 60); 

$val = $mem->get('key1'); 

echo "Get key1 value: " . $val . "
"; 

//保存数组 

$arr = array('aaa', 'bbb', 'ccc', 'ddd'); 

$mem->set('key2', $arr, 0, 60); 

$val2 = $mem->get('key2'); 

echo "Get key2 value: "; 

print_r($val2); 

echo "
"; 

//删除数据 

$mem->delete('key1'); 

$val = $mem->get('key1'); 

echo "Get key1 value: " . $val . "
"; 

//清除所有数据 

$mem->flush(); 

$val2 = $mem->get('key2'); 

echo "Get key2 value: "; 

print_r($val2); 

echo "
"; 

//关闭连接 

$mem->close(); 

?> 

 

 

如果正常的话,浏览器将输出: 

 代码如下:

Get key1 value: This is first value 

Get key1 value: This is replace value 

Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd ) 

Get key1 value: 

Get key2 value: 

 

 

七、实例程序代码分析 

 

初始化一个Memcache的对象:$mem = new Memcache; 

连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:$mem->connect("192.168.0.200", 12000); 

保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:$mem->set(‘key1‘, ‘This is first value', 0, 60); 

从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出: 

 

代码如下:

$val = $mem->get('key1′); 

echo "Get key1 value: " . $val; 

 

现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了: 

代码如下:

$mem->replace('key1', 'This is replace value', 0, 60); 

$val = $mem->get('key1'); 

echo "Get key1 value: " . $val; 

 

同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出: 

 代码如下:

$arr = array('aaa', 'bbb', 'ccc', 'ddd'); 

$mem->set('key2', $arr, 0, 60); 

$val2 = $mem->get('key2'); 

print_r($val2); 

 

现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果: 

 代码如下:$mem->delete('key1'); 

$val = $mem->get('key1'); 

echo "Get key1 value: " . $val . "
";

 

最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接: 

代码如下:$mem->flush(); 

$val2 = $mem->get('key2'); 

echo "Get key2 value: "; 

print_r($val2); 

echo "
";

 

 

八、什么时候使用Memcache和Memcache的使用环境 

 

使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。 

 

分布式应用 

 

Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。 

但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。 

 

减少数据库压力 

 

这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。 

我考虑的一种简单方法: 

后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。 

 

九、Memcache的安全 

 

我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。 

 

内网访问 

 

最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。 

复制代码 代码如下:# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid

Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接。 

 

设置防火墙 

防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。 

复制代码 代码如下:# iptables -F 

# iptables -P INPUT DROP 

# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT 

# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT

上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/750258.htmlTechArticle这篇文章主要介绍了PHP中的Memcache,从Memcache简介开始,详细讲解了如Memcache和memcached的区别、PHP的Memcache所有操作方法、每个操作方法的详...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP行動:現實世界中的示例和應用程序PHP行動:現實世界中的示例和應用程序Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:輕鬆創建交互式Web內容PHP:輕鬆創建交互式Web內容Apr 14, 2025 am 12:15 AM

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python:比較兩種流行的編程語言PHP和Python:比較兩種流行的編程語言Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的持久相關性:它還活著嗎?PHP的持久相關性:它還活著嗎?Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP的當前狀態:查看網絡開發趨勢PHP的當前狀態:查看網絡開發趨勢Apr 13, 2025 am 12:20 AM

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP與其他語言:比較PHP與其他語言:比較Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能PHP與Python:核心功能Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP:網絡開發的關鍵語言PHP:網絡開發的關鍵語言Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。