Memcache高性能缓存与实现跨站登录

本文详细介绍了Memcache服务器的作用,包括数据快速缓存、跨服务器登录,以及Linux下安装、配置和使用方法。重点讲解了PHP操作Memcache的步骤,以及实际应用案例如session共享和跨站登录。
摘要由CSDN通过智能技术生成

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>";
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值