php扩展memcached
❶ 使用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"}
}
}
❷ usememcachedandphp-memcache(d)
针对 memcached 版本从1.2升级至1.3,删除操作协议发生变化。而 memcached 1.4版本中,错误的格式会导致致命错误:失败,错误信息为“CLIENT_ERROR bad command line format”。因此,使用php pecl-memcache时,在新版本中会遇到问题。
对于php pecl-memcached,由于它使用的是libmemcache,所以不存在上述问题。为了在代码中选择使用哪个memcache扩展,我们编写了一个函数:
$mem_flag = 0;$mem_conn = null;function mcached_conn(){global $config, $mem_flag, $mem_conn;if($mem_flag != 1){if ($config['mcache']['version']==0){$mem_conn = memcache_pconnect($config['mcache']['host'], 11211);} else {$mem_conn = new Memcached();$mem_conn->addServer($config['mcache']['host'], 11211);}$mem_flag = 1;}return $mem_conn;}
在需要设置、获取或删除缓存时,通过memcache_version_set()、memcache_version_get()和memcache_version_del()函数,根据配置中的mcache版本信息,选择使用memcache或Memcached。
使用memcache_version_set()函数时,如果配置的mcache版本为0,则调用memcache_set()方法;否则,使用Memcached对象的set()方法。
memcache_version_get()函数同样遵循类似逻辑,选择memcache_get()或Memcached对象的get()方法获取缓存值。
memcache_version_del()函数用于删除缓存,根据配置版本选择memcache_delete()或Memcached对象的delete()方法执行删除操作。
通过这个设计,程序能够智能地根据memcache的版本选择合适的缓存扩展,避免了版本差异带来的问题。
❸ php 怎么配置memcached
分为linux和windows系统下:
windows下:
1、首先下载memcache的windows版本,将下载下来的文件解压出来后会看见一个名为memcached.exe的可执行程序
2、将该文件放到指定目录,如D盘
3、安装:
开始->运行->cmd打开命令窗口
进入D盘:cd d:
安装memcache服务:
在命令窗口输入:
memacahed.exe -d install
等待命令执行完成后,就可以在服务列表中看到memcached服务
4、启动memcache服务:
memcached.exe -d start
5、可以通过以下命令来查看memcache服务是否启动成功:
wmic process get description, executablepath | findstr memcached.exe
可以将memcached.exe的路径放入到系统环境变量中,方便使用。
查看memcache运行状态:
在命令窗口输入:
telnet 127.0.0.1 11211
链接到memcache上,输入stats就可以查看到当前memcache的状态了;
linux下:
1.下载memcache源码
http://www.memcached.org/
2.解压并进入目录
./configure --prefix=/usr/local/memcache
make
make test
sudo make install
3.启动memcache
memcache -d start -u root
验证memcache是否正确安装并启动
netstat -tap | grep memcached
4.安装memcache扩展库
下载memcache扩展
进入到memcache扩展文件
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
make
make install
修改php.ini文件 增加
extension=memcache.so
安装memcached扩展库
下载memcached扩展
memcached扩展需要libMemcached库的支持,所有在安装memcached扩展库之前要确认系统已经安装了libmemcached
安装libmemcached
./configure --prefix=/usr/local/memcache
make
make install
libmemcached安装完成后,就可以安装memcached扩展库
./configure --with-libmemcached-dir=/usr/local/memcached/ --with-php-config=/usr/local/php/bin/php-config
make
make install
同样修改php.ini配置文件,增加
extension=memcached.so
❹ PHP中4个加速,缓存扩展的区别和选用建议
1、eAccelerator
eAccelerator是一个自由开放源码PHP加速器,优化和动态内容缓存,提高了PHP脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化作用,以加快其执行效率。使PHP程序代码执效率能提高1-10倍。从文字上可以理解为:eAccelerator是PHP加速器扩展。
2、memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。从文字上可以理解为:内存缓存扩展,并且针对于集群服务器使用较多,主要用于分布式缓存,算是数据库缓存。
3、Alternative PHP Cache(APC缓存)
Alternative PHP Cache (APC缓存)是一种对PHP有效的开放源高速缓冲储存器工具,他能够缓存Opcode(目标文件)的PHP中间码。 APC的缓存分两部分:系统缓存和用户数据缓存. 系统缓存 是自动使用的,是指APC把PHP文件源码的编译结果缓存起来,然后在再次调用时先对比时间标记。如果未过期,则使用缓存代码运行。默认缓存 3600s(一小时).但是这样仍会浪费大量CPU时间.因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0).不过如果这样设置,改运PHP代码后需要restart一下您的web服务器(比如apache…).目前对APC的性能测试一般指的是这一层cache;从文字上理到:Alternative PHP Cache(APC缓存)也算是一种内存缓存扩展,算是数据库缓存扩展。
4、Xcache
是一个开源的opcode缓存器/优化器, 他能够提高服务器上的PHP性能,他通过把编译PHP后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编译的代码从而提高速度. 通常能够提高您的页面生成速率2到5倍, 降低服务器负载。 其实它与eAccelerator一样是PHP加速器扩展。
以上就是他们的作用与区别,简单一点就是:eAccelerator,xcache是PHP缓存扩展,memcached、APC缓存是数据库缓存扩展,一般两者只有要安装其中一个即可,不要贪多。另外,实际测试中发现当Cache数量超过一定阀值的时候,APC的性能不如Memcache。所以在扩展的选择上,本人一般会选择xcache+memcached这个组合。