memcache服务器作用
快速数据缓存
跨服务器登录
linux下安装memcache服务器
官网-可以自行选择下载的版本
http://memcached.org/downloads
#下载
wget http://www.memcached.org/files/memcached-1.4.34.tar.gz
#解压文件
tar xzf memcached-1.4.34.tar.gz
#编译与安装
./configure && make && make install
#启动程序
memcached -d -m 1024 -u root -l 192.168.10.106 -p 11211
#检查启动的memcache服务端口
netstat -tunlp | grep memcached
#检查启动的memcache进程
pstree -up |grep memcached
#停止程序
pkill memcached
启动命令参数说明
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
-l是监听的服务器IP地址,如果有多个地址的话
-p是设置Memcache监听的端口
-c选项是最大运行的并发连接数,默认是1024
-P是设置保存Memcache的pid文件
停止Memcache进程:
# kill `cat /tmp/memcached.pid`
也可以启动多个守护进程,但是端口不能重复.
memcache服务器操作
#登录memcache服务
telnet 192.168.10.106 11211
#增加:设置 name 0标记 3600秒 5长度
set name 0 3600 5
#查看:
stats
get name
stats items
stats cachedump 1 0
#删除
delete name
#修改
replace name 0 3600 4
php操作memcache服务器
1、下载memcache扩展,并编译安装扩展;
# 这里查询memcache扩展下载
http://pecl.php.net/package-search.php?pkg_name=memcache
#下载
wget http://pecl.php.net/get/memcache-4.0.5.2.tgz
#解压文件
tar xzf memcache-4.0.5.2.tgz
#进入文件夹
cd memcache-4.0.5.2/
#进入文件夹后执行phpize
/usr/local/php/bin/phpize
#查看可以打的模块
./configure -h
#启动缓存支持和php配置文件路径
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
#编译安装
make && make install
#查看是否成功安装memcache.so
ll /usr/local/php/lib/php/extensions/no-debug-zts-20180731/
注意选择的是memcache第一行的
2、编辑php.ini配置文件,开启memcache扩展模块;
vi /usr/local/php/etc/php.ini
#增加
extension=memcache.so
3、重启nginx、php-fpm
#重载nginx
/usr/local/nginx/sbin/nginx -s reload
#重载php
pkill -USR2 php-fpm
4、php操作memcache
<?php
$memcache = new Memcache;
#连接服务
$memcache->connect('192.168.10.106', 11211);
#增加
$memcache->set('name','user1');
$memcache->set('age','18');
$memcache->set('sex','man');
#修改
$memcache->set('name','user123');
#查看
var_dump($memcache->get('name'));
#删除
$memcache->delete('name');
#查看状态
echo "<pre>";
var_dump($memcache->getStats());
#清空数据
$memcache->flush();
memcache缓存操作实例
第一个人第一次查询时候先从数据库查询后存放一份在memcache中
二次之后的查询在memcache中查询,知道缓存过期
实现实例:
<?php
//连接memcache服务器
$mem = new Memcache;
$mem->connect("192.168.10.106", "11211");
if ($rows = $mem->get('data')) {
echo '<div class="alert alert-success">memcache数据</div>';
} else {
//从mysql中查询数据
$pdo = new PDO('mysql:host=192.168.1.3;dbname=shop', 'root', 'root');
$pdo->exec('set names utf8');
$sql = "select * from user";
$smt = $pdo->query($sql);
$rows = $smt->fetchAll(PDO::FETCH_ASSOC);
//把从mysql中查询出来的动态数据放到memcache缓存中
$mem->set('data', $rows);
echo '<div class="alert alert-danger">数据库动态数据</div>';
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" href="./public/bs/css/bootstrap.min.css">
<script src="./public/js/jquery.min.js"></script>
<script src="./public/bs/js/bootstrap.min.js"></script>
<script src='./public/js/jquery.toggle.js'></script>
<script src="./public/bs/js/holder.min.js"></script>
</head>
<body>
<div class="container">
<h1 class="page-header">查看用户:</h1>
<table class="table table-striped table-bordered table-hover">
<tr>
<th>编号</th>
<th>用户名</th>
<th>密码</th>
</tr>
<!--从数据库读取数据-->
<?php
foreach ($rows as $row) {
echo "<tr>";
echo "<td>{$row['id']}</td>";
echo "<td>{$row['username']}</td>";
echo "<td>{$row['password']}</td>";
echo "</tr>";
}
?>
</table>
</div>
</body>
</html>
实战:登录
用户第一次登录将session信息保存在memcache缓存,跳转到首页
在点击跳转其他服务器跨站url地址时候,在跳转url后携带用户session_id信息实现跨站登录
第一部分:memcache下多台服务器session共享更新
session跨域解决:php.ini配置文件修改(支持memcache)
session.save_handler = memcache
session.save_path ="tcp://192.168.10.106:11211"
第二部分:cookie跨域实现用户多服务器登录
cookie跨域解决:
在login登录后保存用户session信息在memcache缓存
<?php
session_start();
include 'config.php';
$username = $_POST['username'];
$password = md5($_POST['password']);
$sql = "select id,username from user where username='{$username}' and password='{$password}' and isadmin=1";
$smt = $pdo->prepare($sql);
$smt->execute();
$row = $smt->fetch();
if ($row) {
$_SESSION['username'] = $row['username'];
$_SESSION['user_id'] = $row['id'];
//连接memcache服务器
$mem = new Memcache;
$mem->connect("192.168.10.106", "11211");
//登录成功后将访问用户session_id标识设置放入memcache中
$mem->set(session_id() . "_data", $_SESSION);
echo "<script>location='index.php'</script>";
} else {
echo "<script>location='login.php'</script>";
}
?>
登录后在跳转其他站点时候,在url后携带session_id信息实现跨站登录
#项目入口文件设置
<?php
if(!empty($_GET[session_name()])){
$mem=new Memcache;
$mem->connect("192.168.10.106", "11211");
$sessid=$_GET[session_name()];
$_SESSION=$mem->get($sessid.'_data');
setcookie(session_name(),$sessid,0,'/');
}else{
session_start();
}
if(!$_SESSION['user_id']){
echo "<script>location='login.php'</script>";
exit;
}
?>
中间省略嵌套html代码。。。
<?php
//拼装,根据session_name获取session_id
$sname = session_name();
$sid = session_id();
echo "<a href='http://www.jiuxian.test/index.php?{$sname}={$sid}' class='btn btn-primary' role='button' target='blank'>linux web服务器</a>";
?>