PHP内部存款和储蓄器缓存成效memcached示例

一、memcached 简介

下文简介了memcached类的施用示范,具有自然的参考价值,感兴趣的伙伴们得以参照一下。

在重重场地,大家都会听到 memcached 这几个名字,但过多同桌只是听过,并不曾用过或实际领悟过,只晓得它是一个很不利的东东。那里差不离介绍一下,memcached
是高效、连忙的布满式内部存款和储蓄器对象缓存系统,首要用来加快 WEB 动态应用程序。

一、memcached 简介

二、memcached 安装

在广大场地,大家都会听到 memcached
那一个名字,但众多同桌只是听过,并未有用过或实际领悟过,只精晓它是三个很科学的东东。那里大致介绍一下,memcached
是神速、神速的布满式内存对象缓存系统,主要用来加快 WEB 动态应用程序。

率先是下载 memcached 了,近期时尚版本是
一.1.1二,直接从官网就能够下载到 memcached-1.1.12.tar.gz。除外,memcached
用到了 libevent,我下载的是
libevent-一.一a.tar.gz

二、memcached 安装

接下去是个别将 libevent-1.一a.tar.gz 和 memcached-1.一.1二.tar.gz
解开包、编写翻译、安装:

率先是下载 memcached 了,目前最新版本是 1.一.1二,直接从官网就能够下载到
memcached-一.壹.12.tar.gz。除却,memcached 用到了 libevent,笔者下载的是
libevent-1.一a.tar.gz。

 

接下去是各自将 libevent-1.1a.tar.gz 和 memcached-一.壹.1二.tar.gz
解开包、编写翻译、安装:

图片 1

# tar -xzf libevent-1.1a.tar.gz
# cd libevent-1.1a
# ./configure –prefix=/usr
# make
# make install
# cd ..
# tar -xzf memcached-1.1.12.tar.gz
# cd memcached-1.1.12
# ./configure –prefix=/usr
# make
# make install

# tar -xzf libevent-1.1a.tar.gz 
# cd libevent-1.1a 
# ./configure --prefix=/usr 
# make 
# make install 
# cd .. 
# tar -xzf memcached-1.1.12.tar.gz 
# cd memcached-1.1.12 
# ./configure --prefix=/usr 
# make 
# make install 

设置到位现在,memcached 应该在 /usr/bin/memcached。

图片 2

三、运营 memcached 守护程序

安装实现今后,memcached 应该在 /usr/bin/memcached。

运维 memcached
守护程序很简短,只需二个命令行就能够,不须求修改任何配置文件(也未曾布署文件给你改改):
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd

三、运转 memcached 守护程序 

参数解释:

运营 memcached
守护程序很简短,只需二个命令行就可以,不须求修改任何配置文件(也绝非配置文件给您修改
): 

  • -d 以守护程序(daemon)情势运营 memcached;
  • -m 设置 memcached 可以采纳的内存大小,单位为 M;
  • -l 设置监听的 IP 地址,假设是本机的话,经常能够不设置此参数;
  • -p 设置监听的端口,默感觉 11211,所以也足以不设置此参数;
  • -u 钦命用户,如果当前为 root 的话,须求采纳此参数钦定用户。

/usr/bin/memcached -d -m 128 -l 1玖二.168.一.一 -p 11211 -u
httpd参数解释: 

当然,还有其余参数可以用,man memcached 一下就足以看出了。

-d 以守护程序(daemon)格局运行 memcached; 
-m 设置 memcached 可以接纳的内部存款和储蓄器大小,单位为 M; 
-l 设置监听的 IP 地址,倘若是本机的话,平常能够不设置此参数; 
-p 设置监听的端口,默感到 1121一,所以也得以不设置此参数; 
-u 钦赐用户,如果当前为 root 的话,供给选用此参数钦点用户。 
自然,还有其余参数能够用,man memcached 一下即可看出了。

四、memcached 的行事原理

4、memcached 的劳作原理 

第叁 memcached
是以守护程序方法运营于二个或四个服务器中,随时接受客户端的连年操作,客户端能够由各样语言编写,近期已知的客户端
API 包含 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与
memcached
服务建立连接之后,接下去的专业正是存取对象了,每一个被存取的靶子都有一个唯壹的标记符
key,存取操作均经过这一个 key 进行,保存到 memcached
中的对象实际是放置内部存款和储蓄器中的,并不是保留在 cache 文件中的,那也是怎么
memcached
能够那样高效便捷的因由。注意,这一个目标并不是持久的,服务甘休现在,里边的数量就会丢掉。

率先 memcached
是以守护程序方法运维于2个或多少个服务器中,随时接受客户端的接连操作,客户端可以由各个语言编写,近期已知的客户端
API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与
memcached
服务建立连接之后,接下去的业务正是存取对象了,每种被存取的目标都有八个唯一的标志符
key,存取操作均经过这些 key 进行,保存到 memcached
中的对象实际是停放内部存款和储蓄器中的,并不是保存在 cache 文件中的,那也是干吗
memcached
能够如此便捷便捷的来由。注意,这个目标并不是持久的,服务停止以往,里边的数码就会丢掉。 
图片 3

5、PHP 如何作为 memcached 客户端

 

有两种艺术能够使 PHP 作为 memcached 客户端,调用 memcached
的劳动进行对象存取操作。

5、PHP 怎样作为 memcached 客户端

首先种,PHP 有一个称呼 memcache 的扩大,Linux 下编写翻译时索要带上
–enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉
php_memcache.dll 后边的注释符,使其可用。

有三种艺术能够使 PHP 作为 memcached 客户端,调用 memcached
的劳动开始展览对象存取操作。

而外,还有一种格局,能够避开扩充、重新编写翻译所拉动的难为,那正是一贯运用
php-memcached-client。

先是种,PHP 有三个叫做 memcache
的扩展
,Linux
下编译时需求带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini
中去掉 php_memcache.dll 后边的注释符,使其可用。

本文选择第二种格局,即便成效会比扩张库稍差那么一点,但难题相当小。

除了,还有一种格局,能够规避扩大、重新编写翻译所推动的劳动,那正是一贯利用 php-memcached-client

6、PHP memcached 应用示范

正文选取第两种艺术,即便作用会比扩张库稍差一点,但难点十分的小。

先是 下载 memcached-client.php,在下载了 memcached-client.php
之后,就能够经过那几个文件中的类“memcached”对 memcached
服务拓展操作了。其实代码调用卓殊简单,主要会用到的不二等秘书技有
add()、get()、replace() 和 delete(),方法求证如下:

 

add ($key, $val, $exp = 0)

陆、PHP memcached 应用示范

往 memcached 中写入对象,$key 是目标的绝无仅有标志符,$val
是写入的靶子数据,$exp 为过期时间,单位为秒,默以为不限制期限间;

首先 下载
memcached-client.php
,在下载了
memcached-client.php 之后,就足以透过这么些文件中的类“memcached”对
memcached 服务开始展览操作了。其实代码调用十三分轻松,首要会用到的主意有
add()、get()、replace() 和 delete(),方法求证如下:

get ($key)

add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是目的的绝无仅有标志符,$val
是写入的靶子数据,$exp 为过期光阴,单位为秒,私下认可为不限时期;

从 memcached 中获得对象数据,通过对象的绝无仅有标志符 $key 获取;

get ($key)
从 memcached 中获取对象数据,通过对象的唯一标记符 $key 获取;

replace ($key, $value, $exp=0)

replace ($key, $value, $exp=0)
应用 $value 替换 memcached 中标记符为 $key 的靶子内容,参数与 add()
方法壹致,只有 $key 对象存在的事态下才会起功效;

使用 $value 替换 memcached 中标记符为 $key 的靶子内容,参数与 add()
方法一致,唯有 $key 对象存在的动静下才会起功效;

delete ($key, $time = 0)
剔除 memcached 中标志符为 $key 的靶子,$time
为可选参数,表示删除在此之前必要等待多久。

delete ($key, $time = 0)

下边是1段简单的测试代码,代码中对标志符为 ‘mykey’
的对象数据开始展览存取操作:

删去 memcached 中标记符为 $key 的目的,$time
为可选参数,表示删除以前需求等待多久。

 

上边是一段轻便的测试代码,代码中对标记符为 ‘mykey’
的对象数据开始展览存取操作: 

图片 4

<?php 
// 包含 memcached 类文件 
require_once('memcached-client.php'); 
// 选项设置 
$options = array( 
 'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务 
 'debug' => true, //是否打开 debug 
 'compress_threshold' => 10240, //超过多少字节的数据时进行压缩 
 'persistant' => false //是否使用持久连接 
 ); 
// 创建 memcached 对象实例 
$mc = new memcached($options); 
// 设置此脚本使用的唯一标识符 
$key = 'mykey'; 
// 往 memcached 中写入对象 
$mc->add($key, 'some random strings'); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->add() ', 60, '_')."n"; 
var_dump($val); 
// 替换已写入的对象数据值 
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx')); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->replace() ', 60, '_')."n"; 
var_dump($val); 
// 删除 memcached 中的对象 
$mc->delete($key); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->delete() ', 60, '_')."n"; 
var_dump($val); 
?>
<?php 
// 包含 memcached 类文件 
require_once('memcached-client.php'); 
// 选项设置 
$options = array( 
'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务 
'debug' => true, //是否打开 debug 
'compress_threshold' => 10240, //超过多少字节的数据时进行压缩 
'persistant' => false //是否使用持久连接 
); 
// 创建 memcached 对象实例 
$mc = new memcached($options); 
// 设置此脚本使用的唯一标识符 
$key = 'mykey'; 
// 往 memcached 中写入对象 
$mc->add($key, 'some random strings'); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->add() ', 60, '_')."n"; 
var_dump($val); 
// 替换已写入的对象数据值 
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx')); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->replace() ', 60, '_')."n"; 
var_dump($val); 
// 删除 memcached 中的对象 
$mc->delete($key); 
$val = $mc->get($key); 
echo "n".str_pad('$mc->delete() ', 60, '_')."n"; 
var_dump($val); 
?> 

是还是不是很轻松,在骨子里运用中,通常会把数据库查询的结果集保存到 memcached
中,下次作客时直接从 memcached
中得到,而不再做数据库查询操作,那样能够在一点都不小程度上减轻数据库的承受。平日会将
SQL 语句 md伍() 之后的值作为唯1标记符 key。下面是七个施用 memcached
来缓存数据库查询结果集的以身作则(此代码片段紧接上边的以身作则代码):

图片 5

<?php 
$sql = 'SELECT * FROM users'; 
$key = md5($sql); //memcached 对象标识符 
{ 
 // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。 
 echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; 
 $conn = mysql_connect('localhost', 'test', 'test'); 
 mysql_select_db('test'); 
 $result = mysql_query($sql); 
 while ($row = mysql_fetch_object($result)) 
  $datas[] = $row; 
 // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。 
 $mc->add($key, $datas); 
{ 
 echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; 
} 
var_dump($datas); 
?> 

是否很简短,在实际应用中,经常会把数据库查询的结果集保存到 memcached
中,下次走访时一贯从 memcached
中得到,而不再做数据库查询操作,那样能够在非常的大程度上缓慢解决数据库的承负。平常会将
SQL 语句 md5() 之后的值作为唯1标志符 key。上面是三个应用 memcached
来缓存数据库查询结果集的示范(此代码片段紧接下边包车型地铁示范代码):

能够看看,使用 memcached
之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的周转速度也拉长了。

 

事先本人早已写过一篇名叫《PHP 达成多服务器共享 SESSION 数据》小说,文中的
SESSION
是使用数据库保存的,在产出国访问问量大的时候,服务器的负载会非常的大,平常会当先MySQL 最利兹接数,利用
memcached,我们得以很好地化解那些标题,工作规律如下:

图片 6

  • 用户访问网页时,查看 memcached 中是不是有眼下用户的 SESSION 数据,使用
    session_id()
    作为唯一标志符;假如数据存在,则一向重回,即便不存在,再举行数据库连接,获取
    SESSION 数据,并将此数额保存到 memcached 中,供下次选用;
  • 此时此刻的 PHP 运营结束(或接纳了 session_write_close())时,会调用
    My_Sess::write()
    方法,将数据写入数据库,这样的话,每一回如故会有数据库操作,对于那个法子,也亟需张开优化。使用二个全局变量,记录用户进入页面时的
    SESSION 数据,然后在 write() 方法内比较此数额与想要写入的 SESSION
    数据是或不是同样,不一致才开始展览数据库连接、写入数据库,同时将 memcached
    中对应的对象删除,假使同样的话,则表示 SESSION
    数据未改变,那么就能够不做任何操作,直接再次回到了;
  • 这正是说用户 SESSION 过期时间怎么消除吗?记得 memcached 的 add()
    方法有个过期时间参数 $exp 吗?把那个参数值设置成小于 SESSION
    最大存活时间就能够。其余别忘了给这个直接在线的用户连续 SESSION
    时间长度,这些能够在 write()
    方法中国化学工业进出口总公司解,通过决断时间,符合条件则更新数据库数据。
<?php 
$sql = 'SELECT * FROM users'; 
$key = md5($sql); //memcached 对象标识符 
if ( !($datas = $mc->get($key)) ) { 
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。 
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; 
$conn = mysql_connect('localhost', 'test', 'test'); 
mysql_select_db('test'); 
$result = mysql_query($sql); 
while ($row = mysql_fetch_object($result)) 
$datas[] = $row; 
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。 
$mc->add($key, $datas); 
} else { 
echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; 
} 
var_dump($datas); 
?> 

以上正是本文的全部内容,希望对我们的求学抱有扶助,也愿意大家多多帮忙脚本之家。

图片 7

您或者感兴趣的文章:

 

能够看来,使用 memcached
之后,能够收缩数据库连接、查询操作,数据库负载下来了,脚本的运转速度也抓实了。

前边本人壹度写过1篇名称为《PHP 达成多服务器共享 SESSION
数据》
小说,文中的
SESSION
是应用数据库保存的,在产出国访问问量大的时候,服务器的负载会一点都不小,平日会超过MySQL 最大连接数,利用
memcached,大家得以很好地消除那么些主题材料,专门的职业规律如下:

  • 用户访问网页时,查看 memcached 中是还是不是有日前用户的 SESSION 数据,使用
    session_id()
    作为唯一标志符;若是数额存在,则一贯回到,固然不存在,再实行数据库连接,获取
    SESSION 数据,并将此数量保存到 memcached 中,供下次使用;
  • 目前的 PHP
    运营甘休(或应用了 session_write_close())时,会调用
    My_Sess::write()
    方法,将数据写入数据库,那样的话,每便照旧会有数据库操作,对于那么些措施,也需求进行优化。使用3个全局变量,记录用户进入页面时的
    SESSION 数据,然后在 write() 方法内相比较此数据与想要写入的 SESSION
    数据是还是不是同样,不相同才开始展览数据库连接、写入数据库,同时将 memcached
    中对应的靶子删除,假若一致的话,则象征 SESSION
    数据未退换,那么就足以不做此外操作,直接重返了;
  • 那么用户 SESSION 过期时间怎么化解吧?记得 memcached 的 add()
    方法有个过期时间参数 $exp 吗?把这么些参数值设置成小于 SESSION
    最大存活时间就能够。此外别忘了给那1个直接在线的用户一连 SESSION
    时间长度,那些能够在 write()
    方法中国化学工业进出口总公司解,通过判定时间,符合条件则更新数据库数据。

7、相关能源

 来源:[http://www.cnblogs.com/hf8051/p/4702398.html\] 谢谢博友分享!