一、memcached 简介
memcached是高性能的分布式内存缓存做事器。一样平常的利用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web运用的速率、提高可扩展性。它可以应对任意多个连接,利用非壅塞的网络IO。由于它的事情机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
二、memcached 安装
首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz。
接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:
# 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。
看到了这里的程序员绝对是爱学习的,我为大家准备了一套佳构PHP教程,里面涵盖 memcached、PHP性能优化,MySQL性能优化,Nginx,YII2,laravel等学习教程,如果你已经会了,想要精通进阶中高等PHP,我这里也有专注于PHP中高等进阶的教程,点击下方标题链接即可获取方法!
全套laravel框架、ThinkPHP框架全套教程分享,PHP程序员福利!
PHP开拓三年只懂增编削查?那是你没有方案好php学习路线
三、运行 memcached 守护程序
运行 memcached 守护程序很大略,只需一个命令行即可,不须要修正任何配置文件(也没有配置文件给你修正 ):
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
参数阐明:
-d 以守护程序(daemon)办法运行 memcached;-m 设置 memcached 可以利用的内存大小,单位为 M; -l 设置监听的 IP 地址,如果是本机的话,常日可以不设置此参数;-p 设置监听的端口,默认为 11211,以是也可以不设置此参数; -u 指定用户,如果当前为 root 的话,须要利用此参数指定用户。
当然,还有其它参数可以用,man memcached 一下就可以看到了。
四、memcached 的事情事理
首先 memcached 因此守护程序办法运行于一个或多个做事器中,随时接管客户真个连接操作,客户端可以由各种措辞编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 做事建立连接之后,接下来的事情便是存取工具了,每个被存取的工具都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的工具实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的缘故原由。把稳,这些工具并不是持久的,做事停滞之后,里边的数据就会丢失。
五、PHP 如何作为 memcached 客户端
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的做事进行工具存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时须要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那便是直策应用 php-memcached-client。
本文选用第二种办法,虽然效率会比扩展库稍差一些,但问题不大。
六、PHP memcached 运用示例
首先 下载 memcached-client.php,不才载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 做事进行操作了。实在代码调用非常大略,紧张会用到的方法有 add()、get()、replace() 和 DELETE(),方法解释如下:
1
add ($key, $val, $exp = 0)
往 memcached 中写入工具,$key 是工具的唯一标识符,$val 是写入的工具数据,$exp 为过期韶光,单位为秒,默认为不限韶光;
get ($key)
从 memcached 中获取工具数据,通过工具的唯一标识符 $key 获取;
1
replace ($key, $value, $exp=0)
利用 $value 更换 memcached 中标识符为 $key 的工具内容,参数与 add() 方法一样,只有 $key 工具存在的情形下才会起浸染;
1
DELETE ($key, $time = 0)
删除 memcached 中标识符为 $key 的工具,$time 为可选参数,表示删除之前须要等待多永劫光。
下面是一段大略的测试代码,代码中对标识符为 'mykey' 的工具数据进行存取操作:
<?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 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
<?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);?>
可以看出,利用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速率也提高了。
之前说过SESSION 是利用数据库保存的,在并发访问量大的时候,做事器的负载会很大,常常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地办理这个问题,事情事理如下:
用户访问网页时,查看 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() 方法中办理,通过判断韶光,符合条件则更新数据库数据。