Ⅰ 基于memcached的session会话共享怎样实现
由于Cookie是保存的用户客户端的,安全性存在问题,为保证用户数据的安全性,我们必须使用Session机制来保存用户登录后的一些信息。
如果我们使用LVS对Apache实现负载均衡,就无法保证用户每次都能被分配到同一台Apache Server上,以取到自己的Session,虽然LVS可以加-p参数来保证客户端每次都被分配到同一台Apache Server上,但这种方式存在一些弊端,比如必须设置一个保持时间,如果时间太长了,LVS就需要缓存大量信息,时间太短了,又不能保证用户每次被分配到同一台Server上,而且这种方式也不易实现Session的冗余备份。
因此,我们需要Session共享,也就是说每台Apache都可以访问到所有的Session,这样用户被分配到哪台Server就不重要了。
Session共享主要有多种实现方式:
Session复制。Apache可以实现把Session同步到其他Server上去,但这种技术太复杂,而且影响性能,占用内存,所以不推荐使用。
Session集中存储。存储介质可以是NFS文件系统、数据库、Memcached,从性能上考虑,当然是Memcached最好,推荐使用。
1.3 实现
1.3.1 安装Memcached
Memcached是基于libevent实现的,所以要首先确保已经安装libevent。
安装libevent
tar zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr
make && make install
安装Memcached
tar zxvf memcached-1.4.4.tar.gz
cd memcached-1.4.4
./configure --prefix=/usr/local/memcached --with-libevent=/usr
make && make install
启动Memcached
/usr/local/memcached/bin/memcached -d -m 10 -u root -l 192.168.0.9 -p 11211 -c 256 -P /tmp/memcached.pid
1.3.2 安装php扩展pecl::memcache
pecl install memcache
或源码安装
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure
make && make install
将 php.ini 中 extension=memcache.so 打开,重启一下 apache,查看 phpinfo 中的 "Registered save handlers" 会有"files user memcache" 这3个可用。
另外,基于libmemached的php扩展在pecl发布了,叫pecl::memcached,性能上可能会更好。
1.3.3 配置Memcached保存Session
修改配置文件,在 php.ini 中全局设置
session.save_handler = memcache
session.save_path = "tcp://192.168.0.9:11211"
或者某个目录下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.0.9:11211"
再或者在某个一个应用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://192.168.0.9:11211");
使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
1.3.4 测试
<?php
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>
可以直接用sessionid 去 memcached 里查询一下:
telnet 192.168.0.9 11211
get
得到
TEST|i:1177556731;TEST3|i:1177556881;
这样的结果,说明session 正常工作
用Memcached来存储 session 在读写速度上会比文件快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组Memcached服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题,如果要持久化数据,也可以使用新浪开发的MemcacheDB或日本人开发的Tokyo tyrant+Tokyo Cabinet。
另外,如何解决Memcached的单点故障问题,有以下几个方案:
使用上面提到的Memcache::addServer增加多台Memcached,但这样只能达到一台出故障之后,另外一台可以使用,但每台Memcached的数据是独立的,不共享,不复制,出故障的数据丢失了。
使用Memcached的一个补丁应用repcached,可以实现multi master replication和asynchronous data repliacation,并且支持原来Memcached的所有命令。不过这个应用只支持Memcached1.2.x版本。
使用Tokyo tyrant+Tokyo Cabinet(简称TT+TC)。TT兼容Memcached协议,可以直接替换使用,TT支持replication,可以实现故障转移,TC则为TT提供持久化。
TT+TC是日本最大的社交类网站mixi.jp开发的开源应用,并已成功应用在mixi.jp中,值得研究。
Ⅱ php 能不能编译的时候一起加入 memcached 扩展
一 安装libevent
1.去官网http://libevent.org/ 下载最新源码,我用的是libevent-2.0.20-stable.tar.gz
2.解压到/usr/src目录 ,执行命令:sudo tar -zxvf libevent-2.0.20-stable.tar.gz -C /usr/src
3.进入解压以后的目录,用sudo方式执行命令:sudo ./configure --prefix=/usr/local/libevent ; make ; make install
二 安装memcache
1.去官网 http://memcached.org/ 下最新源码,我用的是memcached-1.4.15.tar.gz
2.解压到/usr/src目录 ,执行命令:sudo tar -zxvf memcached-1.4.15.tar.gz -C /usr/src
3.进入解压以后的目录,用sudo方式执行命令:sudo ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent; make ; make install
三 安装php的memcache扩展
有两个版本一个是memcache(http://pecl.php.net/package/memcache ),另一个是基于libmemcached的memcached版本(http://pecl.php.net/package/memcached );
网上查的资料是说前一个是原生的,后一个比前一个功能更强大。比较推荐使用基于libmemcahced 库的memcached扩展。支持memcache提供的CAS操作,稳定性和效率也更好。
这里我使用基于libmemcached 库的memcached扩展,安装步骤如下:
首先,安装libmemcached库
1.去网址 https://launchpad.net/libmemcached (或者http://libmemcached.org/libMemcached.html )下载源码,
我用的是libmemcached-1.0.14.tar.gz
2.解压缩到/usr/src目录,用sudo方式执行命令:sudo tar -zxvf libmemcached-1.0.14.tar.gz -C /usr/src
3.进入目录/usr/src/libmemcached-1.0.14/,sudo方式执行命令:./configure ;make;make install (不加--prefix=/usr/local/libmemcached 指定安装目录时,libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。)
4.make时遇到问题:sorry, unimplemented: Graphite loop optimizations can only be used if the libcloog-ppl0 package is installed。解决办法是修改Makefile,查找并去掉 floop-parallelize-all(应该有两处需要去掉),看了网上资料说是去掉后表示不使用Graphite loop 优化。
5.再次make,遇到问题:fatal error: sasl/sasl.h: No such file or directory. 在网上搜到的解决办法是:
Depending on your operating system, you'll need to install the cyrus-sasl development package.
That would be cyrus-sasl-devel on RedHat based distros and libsasl2-dev on Debian based distros IIRC.
我在ubuntu下直接用sudo apt-get install libsasl2-dev 安装了。
6.编译还是遇到问题,显示无法链接到sasl的一些文件。问题显示如下:
undefined reference to `sasl_client_step'
undefined reference to `sasl_dispose'
undefined reference to `sasl_client_start'
undefined reference to `sasl_client_new'
解决办法是重新执行configure命令,增加相应的参数。sudo执行命令:sudo ./configure --enable-sasl --without-memcached LDFLAGS=-Wl,--as-neede ;make; make install
7.终于安装libmemcached库成功了。。。
其次,安装memcached版本的php扩展
1. 去网址http://pecl.php.net/package/memcached 下载memcached版本,我用的是memcached-2.1.0.tgz
2. 解压到/usr/src目录 ,执行命令:sudo tar -zxvf memcached-2.1.0.tgz -C /usr/src
3. 进入解压以后的目录,是没有configure文件的,用sudo方式执行命令来生成:sudo /usr/local/php/bin/phpize
4.遇到问题:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. 网上搜到的解决办法为:
cd /usr/src
wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
tar -zvxf m4-1.4.9.tar.gz
cd m4-1.4.9/
./configure && make && make install
cd ../
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
tar -zvxf autoconf-2.62.tar.gz
cd autoconf-2.62/
./configure && make && make install
5.这是再次执行sudo /usr/local/php/bin/phpize,就可以成功生成configure文件了。(phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,官方说明网址为:http://php.net/manual/en/install.pecl.phpize.php)
6.用sudo方式执行命令./configure --with-php-config=/usr/local/php/bin/php-config; make ; make install
7.编译完成了,还需要做的是在/usr/local/lib/php.ini文件中加入extension值:extension=memcache.so
8.重启/usr/local/php/sbin/php-fpm程序使配置生效,但是报错:
ERROR: failed to open configuration file '/usr/local/php/etc/php-fpm.conf': No such file or directory (2)
ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf'
ERROR: FPM initialization failed
解决办法为: (1)cd /usr/local/php/etc/; (2)mv php-fpm.conf.default php-fpm.conf
9.重启仍然出现问题:ERROR: [pool www] cannot get uid for user 'www'。解决办法为:编辑文件vim /usr/local/php/etc/php-fpm.conf,
把user = nobody group = nobody 中的nobody修改成有效的用户和用户组名称。
Ⅲ 如何在Centos的linux操作系统安装php的memcache扩展
准备工作:
1、一台linux的服务器
2、下载相应版本的php源码,知道自己php的版本并且知道phpize的位置
3、懂基本的linux解压命令和编译
操作步骤:
1、通过ssh登陆到我们的服务器,找到我们的phpize位置,如果不知道下载跟目前使用版本相同的php源码重新编译一下
2、下载memcached的源码包,并解压安装
wgettar -zxvf memcache-3.0.8.tgz #解压cd memcache-3.0.8 #进入源码包/usr/local/php/bin/phpize #执行phpize./configure --with-php-config=/usr/local/php/php-config #准备编译make && make install #编译安装
3、配置php.ini文件在最后面添加扩展进去
vim /etc/php.iniextension=memcache.so
4、重启web服务器,我用的是apache
service httpd restart
5、编写一个phpinfo文件去查看有没有安装成功
Ⅳ php7无法安装memcache扩展 系统 centos-6.8 Nginx-1.10.2 PHP-7.0.13/5.6.28 memcached-1.4
一 下载需要的源码包
所有安装包均选用最新的。
1. 下载libevent2.0.22
点击红色部分下载
下载memcached1.4.24
点击红色部分,下载最新版本
下载php扩展memcache3.0.8
选择需要的版本
二 安装详细步骤
首先将以上三个软件包下载到/tmp目录下
1. 安装libevent
cd /tmp #首先进入到该下载包的目录
tar zxvf libevent-2.0.22-stable.tar.gz #解压包cd libevent-2.0.22-stable #进入到解压的目录./configure --prefix=/usr/local #编译前配置,生成Makefile文件,路径可自行更改make; make install #编译+安装
1
测试是否安装成功
看到这些信息,表示成功啦
2. 安装memcached
cd /tmp #首先进入到该下载包的目录
tar zxvf memcached-1.4.24.tar.gz #解压包
cd memcached-1.4.24 #进入到解压的目录
./configure –with-libevent=/usr/local #编译前配置,生成Makefile文件,路径必须与libevent中一致make; make install #编译+安装
1
测试是否安装成功
表示成功的信息
通过以上操作,就完成了memcached服务器的安装。特别的简单吧!现在就来搞一搞memcache的php扩展安装吧3. 安装扩展
cd /tmp #首先进入到该下载包的目录
tar zxvf memcache-3.0.8.tgz #解压包
cd memcache-3.0.8 #进入到解压的目录
/opt/lampp/bin/phpize #动态为php添加扩展。phpize路径可能不一致,请根据自己的实际情况./configure –enable-memcache –with-php-config=/opt/lampp/bin/php-config –with-zlib-dir #php-config请根据自己环境情况填写make; make install #编译+安装
1
完成以上步骤时,心情愉悦的点击了enter,准备喝口水潇洒一下,结果出现了一下错误(这也是我写这篇博客的原因,要不都懒得记录了)错误信息
看了下代码错误信息,说是zlib.h找不到。找不到就给他安一个嘛。真是的安装zlib
下载zlib-1.2.8.tar.gz
下载地址:http://www.zlib.net/
如图:
红色部分点击
cd /tmp #首先进入到该下载包的目录
tar zxvf zlib-1.2.8.tar.gz #解压包
cd zlib-1.2.8 #进入到解压的目录
./configure --prefix=/usr/local/zlib
make; make install #编译+安装
1
再进行配置一下系统的文件,加载刚才编译安装的zlib生成的库文件vi /etc/ld.so.conf.d/zlib.conf
加入如下内容后保存退出: /usr/local/zlib/lib也就是添加安装目录的文件路径,库文件。ldconfig 运行之后就会加载安装的库文件了。
OK,到这一步了,此时,重新在memcache的php扩展中执行make;make install命令如果看到以下信息,表示成功:
扩展安装成功
三 配置php.ini文件
首先通过phpinfo函数,找到php.ini的路径,我的是:/opt/lampp/etc/php.ini在其中添加如下内容:
修改extension_dir路径:
extension_dir = “/opt/lampp/lib/php/extensions/no-debug-non-zts-20121212/”
extension=memcache.so
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
然后重新启动apache,再次通过phpinfo查看一下情况。如果有如下内容,表示配置成功:
信息
四 配置memcached服务器
启动memcached服务器
memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid参数说明:
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址127.0.0.1,-p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid2. 结束memcached进行
kill cat /tmp/memcached.pid
3. 检查memcached是否已经启动
看到绿色框中内容,就表示完成
五 测试php的memcache扩展
<?php
$mem = new Memcache;
$mem->connect("192.168.12.201", 13001);
$mem->set('key','This is a test!', 0, 60);$val = $mem->get('key');
echo $val;
?>
写在后面:大家有兴趣可以将session改为使用memcache来保存。php自身使用文件的方式,不太好,动不动文件大小总和就上G了。
Ⅳ 小白谈memcache和memcached的区别
1、基于的库不同。memcache扩展是原生的(基于pecl扩展库)。memcached扩展是基于libmemcached库开发的,所以支持cas操作,cas操作就是多个线程并发修改同一个key的值的时候能够进行处理。
memcache.so和 memcached.so是两个扩展文件名称(php中扩展在linux下是.so后缀,window下是dll文件)。也就是后者就要libmemcached库来实现。
2、mc支持面向对象和面向过程两套接口操作服务端。而mcd扩展只支持面向对象方式操作。这也是库(libmemcached与libmemcache)的不同影响的。
3、 memcached支持Binary Protocol,而memcache不支持。还是库的不同导致。这意味着memcached会有更高的性能。
Ⅵ php 7 有可用的 memcache,redis 扩展吗
1、PHP Memcache扩展下载
[raykaeso@web ~]$ wget memcache-2.2.7.tgz
2、解压安装并进入Memcache目录
[raykaeso@web ~]$ tar xzf memcache-2.2.7.tgz
[raykaeso@web ~]$ cd memcache-2.2.7
3、在Memcache目录下,生成configure配置文件
[raykaeso@web memcache-2.2.7]$ /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Mole Api No: 20090626
Zend Extension Api No: 220090626
[raykaeso@web memcache-2.2.7]$ ./configure –with-php-config=/usr/local/php/bin/php-config
[raykaeso@web memcache-2.2.7]$ make
Ⅶ Fatal error: Class 'Memcache' not found 是怎么回事啊
php有两个关于memcache的扩展,都在pecl上,两者名称上的区别是末尾有没有d。
更进一步的说,memcached扩展更多的支持一些多节点、超时设置等方面的支持。
so,你需要的是extension=memcache.so,并重启apache或php-fpm。
Ⅷ 用ssh编辑php.ini, 输入vi php.ini之后全都是些介绍,怎么才能插入 extension=memcache.so
我来回的吧:
# cd /etc //这里是 php.ini 的目录。可以根据你自己实际情况 切换到 相应的目录。
# vi php.ini //打开php.ini文件,然后使用方向键,上下左右切换到要输入的地方。
//键盘按键 i 切换到php.ini文件的编辑模式
//输入:extension=memcache.so
// 输入完毕后,按 Esc键退出 编辑模式
// 然后按shift+冒号键,再输入wq,再输入 shift+感叹号 ,回车即可保存。即 :wq! 保存
Ⅸ php怎么开启memcache
下载memcache安装包和php扩展文件php_memcache.dll。解压memcache,把memcached移动到C盘。
单击开始菜单,运行“cmd”。
cd .. //进入c盘
cd memcached //进入memcache目录
memcache.exe -d install //安装memcache服务
设置php:找到php安装目录,打开php.ini文件。找到配置文件里允许支持扩展的区域exetension=。。,添加一行exetension=php_memcache.dll。
把php扩展文件php_memcache.dll移动到php安装目录下的ext目录下。注意在php.ini中要设置好exetension目录。php_memcache.dll此文件需要先在网上下载下来!
设置apache:
打开apache配置文件httpd.conf,找到LoadMole加载模块区域。去掉前面的“LoadMole mem_cache_mole moles/mod_mem_cache.so”#号
重启apache服务。linux下重启使用命令:service httpd restart。
然后就大功告成!