精华内容
下载资源
问答
  • memcache

    2019-05-01 18:37:48
    一.系统核心优化 ...memcache、mysql优化、静态化技术 优化的是什么地方? 二.Memcache memory cache 内存缓存技术 Memcache或Redis是中间介质,可以帮助我们通过php语言实现对内存的操作 ...

    一.系统核心优化
    思路:以小博大、利用最小的资源换取最大的回报
    memcache、mysql优化、静态化技术
    优化的是什么地方?
    在这里插入图片描述
    二.Memcache
    memory cache 内存缓存技术
    在这里插入图片描述
    Memcache或Redis是中间介质,可以帮助我们通过php语言实现对内存的操作
    1.memcache和redis的区别、联系
    区别:
    前者:
    每个key的数据最大是1M
    对各种技术支持比较全面,session可以存储memcache中,各种框架(例如thinkphp)对memcache支持的比较好
    比较老牌、传统的内存缓存技术
    适合存储简单、实用的数据
    数据类型只有String
    没有持久化
    后者:
    每个key的数据最大是1G
    对各种技术支持没有memcache更好。
    新兴的内存缓存技术
    适合做集合计算(list/set/sortset)
    数据类型较丰富(String/list/Set/Sort set/hash)
    有持久化
    联系:
    数据存储在内存当中,数据模型都是key-value

    两种内存缓存技术都要掌握,大家有各自擅长的地方
    memcache:对session支持,各种框架支持
    redis:集合计算

    2 安装使用memcache
    解压:
    在这里插入图片描述
    解压后生成文件(服务器端执行文件):
    在这里插入图片描述
    考虑(服务器端)执行文件到H:目录:
    在这里插入图片描述
    2.1 开启memcache服务
    前台开启服务(不推荐):
    在这里插入图片描述
    Ctrl+C结束掉

    开启服务可以设置的参数:
    在这里插入图片描述
    通过设置参数开启memcache服务:(这是前台运行,用ctrl+c停止掉)
    在这里插入图片描述
    之后可以在任务里边看到memcache:
    在这里插入图片描述
    2.2 设置开机启动项服务
    sc create 名称 svn相关参数(这是SVN启动后台服务的指令)
    在这里插入图片描述
    现在没有memcache服务:
    在这里插入图片描述
    开机启动项服务有安装成功:
    在这里插入图片描述
    如果想要详细设置,那么就如下图
    在这里插入图片描述

    通过-d start开启服务:
    在这里插入图片描述
    停止和卸载服务:
    在这里插入图片描述
    3.给php开启memcache扩展
    给php.ini设置对应的扩展(没有就添加一行):
    在这里插入图片描述
    给php扩展目录拷贝对应的扩展文件:
    在这里插入图片描述
    之后重启apache

    php开启memcache扩展成功:
    在这里插入图片描述
    4. php操作memcache
    在php中memcache体现为“类Memcache”
    具体使用:实例化对象,对象调用成员方法即可。

    具体操作:
    设置
         $obj -> set(key,value,是否有压缩0/1,有效期);
    是否压缩:
         不考虑速度,计较内存空间,压缩
         计较速度,不计较内存空间,不压缩
    有效期:
         单位:秒
    获取
         $obj -> get(key);
    删除
         $obj -> delete(key);

    连接memcache服务器成功:
    在这里插入图片描述
    给memcache设置一个week的key变量:
    在这里插入图片描述
    把刚才设置好的key给读取出来:
    在这里插入图片描述
    4.1 key的命名
    key的名字可以有许多字符组成,长度不能超过250字节。
    空格不能作为名字的组成内容。
    (utf-8字符集的一个汉字是3个字节)
    在这里插入图片描述
    在这里插入图片描述
    4.2 有效期
    为0即不失效。
    两种方式:
    ① 时间戳:1970-1-1号到目前的秒数
    ② 时间差:时间数字,从目前往后延伸的时间长度
    时间差的值大到一定程度与时间戳的值可以保持一致
    (限制:时间差最多不能多于30天,否则其为时间戳)
    两种方式设置key的有效期:
    在这里插入图片描述
    获取有效期内的key信息:
    在这里插入图片描述
    有效期的限制(变形):
    在这里插入图片描述
    前者的信息可以正常获取,后者已经早早过期
    在这里插入图片描述
    一个key的有效期为60天只能通过时间戳方式设置。
    4.3 各种数据类型的存储
    php的数据类型(8种):
    基本类型:int string boolean float
    复合类型:array object resource null

    基本类型 数据在memcache内部通过字符串存储:
    在这里插入图片描述
    在这里插入图片描述
    复合类型 数据在memcache中是原样存储:
    在这里插入图片描述
    在这里插入图片描述
    有的时候在memcache中需要把各种数据类型信息都变为字符串存储,就需要对复合类型信息进行序列化操作:serialize() unserailize()
    4.4 第三个参数压缩作用
    通过zlib进行压缩处理
    4.5 php中其他相关操作方法
    add() 给memcache增加一个key
    不存在就增加,存在就报错
    set() 给memcache设置key
    不存在就增加,存在就修改

    close() 关闭memcache连接,一般根据具体情况,设置到php代码的最后

    decrement() 给key的值减少1 i–
    increment() 给key的值累加1 i++

    flush() 清空memcache的全部key

    replace() 替换key的值为其他值
    存在就替换,不存在就报错
    5.终端命令方式操作
    登录到memcache的操作终端:
    telnet是远程登录协议:
    在这里插入图片描述
    登录memcache终端成功:
    在这里插入图片描述
    telnet提示不是内部或外部指令的解决:
    控制面板–》程序和功能–》打开或关闭windows服务–》telnet客户端:
    在这里插入图片描述
    在终端窗口实现memcache的操作:
    设置:
    > set key 是否压缩 有效期 数据长度 [回车]
    > 数据

    > add key 是否压缩 有效期 数据长度 [回车]
    > 数据

    > replace key 是否压缩 有效期 数据长度 [回车]
    > 数据
    (数据真实长度 与 设置长度 要完全一致)
    获取:
    > get key
    删除:
    > delete key
    > flush_all //删除全部的key

    给memcache设置一个key和读取:
    在这里插入图片描述
    通过php程序也可以读取到终端窗口设置的key:
    在这里插入图片描述
    5.1 获取memcache统计的信息
    在这里插入图片描述
    上图中连接数指的是访问一次,连接一次,其实就是访问的次数,总共设置的key减去活跃的key意思就是多出来的key不是被删除了,就是过期了. memecache设置用多少的内存,如果超过了,会把你好长时间不用的key删掉,evictions意思就是删除了多少个这样的key

    在php程序里边可以通过getStats()获得memcache服务器的统计信息。

    利用SecureCRT也可以实现对memcache的终端操作:
    在这里插入图片描述
    在这里插入图片描述
    6. 分布式memcache的部署
    如果单个memcache保存的数据非常多,memcache本身工作负载就会非常高,为了降低该memcache的工作量,提高其运行速度,可以设置多个memcache平均分担工作量,该模式就是分布式。
    (例如一个memcache要保存1000W的数据,如果平均分配到5个memcache服务器,则每个就只保留200W的数据)
    Redis的分布式是“主从模式”结构,一主多从。
    Memcache的分布式与Redis的不同,其是把一台memcache的工作平均分配给多个memcache分担。
    分布式具体的实施:
    1)可以在一个服务器里边开启多个memcache服务
    2)可以配置多个服务器,每个服务器里边都运行memcache服务
    在这里插入图片描述
    每个memcache服务器都是平等的,中间通过“算法”保证数据的平均分配。
    php代码的编写还保持原有习惯即可。
    key的分配原则:依次轮询、求余
    一台服务器开启三个memcache服务:
    在这里插入图片描述
    分布式php代码的设计:
    在这里插入图片描述
    无需考虑key存储在那个memcache服务器内部,memcache通过算法会自动给匹配上,不影响我们正常获得数据:
    在这里插入图片描述
    注意:
    在每个php脚本文件内部服务器连接的顺序都要保持一致,否则数据有可能获取不到。
    在这里插入图片描述
    在这里插入图片描述
    7.缓存失效
    memcache中的key超过有效期、或被系统强制删除掉了。
    7.1有效期过期
    session信息过期(失效了),通过“懒惰”模式给删除的。
    session是在文件中存储,如果session已经过期,其文件还是存在的,下次有一个用户访问session信息(用户登录系统),此时已经过期的session就有一定的几率被删除(session文件被删除)。

    memcache中key的删除也是懒惰模式,如果超过有效期,该key还是存在的,当你get获取它的时候,其就消失了。
    在这里插入图片描述
    在这里插入图片描述
    7.2 空间不足被强制删除
    memcache的内存可用空间默认为64MB,如果存储的数据非常多,可用空间不足了。
    此时仍然可以存储数据,因为memcache内部有LRU机制。
    LRU: Least recently use 最近很少被使用的数据
    内存空间如果不足,就会删除最近很少经常使用的数据。

    如果不想使用LRU机制,就可以设置参数-M
    开启memcache服务的时候带参数-M:
    在这里插入图片描述
    -M:内存空间耗尽,要报错,而不使用LRU机制删除数据

    8.session入memcache
    传统session的数据是在硬盘的文件中存储的。
    该session很大情况用于存储用户的相关信息。用于判断一个用户是否登录系统。

    两个服务器的session如果是文件形成存储,则他们的session互相不能通信。
    两个服务器的session如果是存储在memcache中的,则他们的session可以通信。
    在这里插入图片描述
    一个网站是有多个服务器支撑的,用户在服务器1里边登录系统,其session持久化的信息报保存在一个memcache服务器里边,这样服务器2/3/4也可以去memcache读取session信息,就可以保证用户访问各个服务器的时候无需重复登录系统。
    (以上情况还可以把session存储在mysql中)
    8.1 具体操作
    php.ini关于session的设置:
    存储session形式:
    在这里插入图片描述
    存储在哪:
    在这里插入图片描述
    session存储到memcache的设置:
    在这里插入图片描述
    读取memcache中的session信息:
    在这里插入图片描述
    session保存到memcache中key的名称为session_id的值:
    在这里插入图片描述
    如果memcache是分布式的:
    在这里插入图片描述

    展开全文
  • Memcache

    2016-11-08 14:48:07
    在说Memcache的长连接(pconnect)和短连接(connect)之前要先说说Memcache的addServer,Memcache的addServer是增加一个服务器到连接池中(addServer没有连接到服务器的动作,所以在memcache进程没有启动的时候,执行add...

    addServer
    在说Memcache的长连接(pconnect)和短连接(connect)之前要先说说Memcache的addServer,Memcache的addServer是增加一个服务器到连接池中(addServer没有连接到服务器的动作,所以在memcache进程没有启动的时候,执行addServer成功也会返回true)。通过 Memcache::addServer() 打开的连接将会在脚本执行结束后自动关闭,也可以使用 Memcache::close()进行手动关闭。当使用这个方法的时候(与Memcache::connect()和 Memcache::pconnect()相反) 网络连接并不会立刻建立,而是直到真正使用的时候才建立。 因此在加入大量服务器到连接池中时也是没有开销的,因为它们可能并不会被使用。addServer的第三个参数persistent就是是否使用长连接(pconnect),默认是TRUE。

    pconnect

     

    Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。Memcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解。

    为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

    Memcache的安装

    分为两个过程:memcache服务器端的安装和memcached客户端的安装。

    所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储。

    所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。

    PHP的Memcache

    01<?php
    02    //连接
    03    $mem = new Memcache;
    04    $mem->connect("db.nowamagic.net", 12000);
    05    //保存数据
    06    $mem->set('key1', 'This is first value', 0, 60);
    07    $val = $mem->get('key1');
    08    echo "Get key1 value: " . $val ."<br />";
    09    //替换数据
    10    $mem->replace('key1', 'This is replace value', 0, 60);
    11    $val = $mem->get('key1');
    12    echo "Get key1 value: " . $val . "<br />";
    13    //保存数组
    14    $arr = array('aaa', 'bbb', 'ccc', 'ddd');
    15    $mem->set('key2', $arr, 0, 60);
    16    $val2 = $mem->get('key2');
    17    echo "Get key2 value: ";
    18    print_r($val2);
    19    echo "<br />";
    20    //删除数据
    21    $mem->delete('key1');
    22    $val = $mem->get('key1');
    23    echo "Get key1 value: " . $val . "<br />";
    24    //清除所有数据
    25    $mem->flush();
    26    $val2 = $mem->get('key2');
    27    echo "Get key2 value: ";
    28    print_r($val2);
    29    echo "<br />";
    30    //关闭连接
    31    $mem->close();
    32?>

    如果正常的话,浏览器将输出:

    1Get key1 value: This is first value
    2Get key1 value: This is replace value
    3Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
    4Get key1 value:
    5Get key2 value:

    程序代码分析

    初始化一个Memcache的对象:$mem = new Memcache;

    连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:$mem->connect("192.168.0.200", 12000);

    保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:$mem->set(‘key1‘, ‘This is first value’, 0, 60);

    从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:

    1$val = $mem->get(’key1′);
    2echo "Get key1 value: " . $val;

    现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:

    1$mem->replace('key1', 'This is replace value', 0, 60);
    2$val = $mem->get('key1');
    3echo "Get key1 value: " . $val;

    同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出:

    1$arr = array('aaa', 'bbb', 'ccc', 'ddd');
    2$mem->set('key2', $arr, 0, 60);
    3$val2 = $mem->get('key2');
    4print_r($val2);

    现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果:

    1$mem->delete('key1');
    2$val = $mem->get('key1');
    3echo "Get key1 value: " . $val . "<br />";

    最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接:

    1$mem->flush();
    2$val2 = $mem->get('key2');
    3echo "Get key2 value: ";
    4print_r($val2);
    5echo "<br />";

    Memcache的使用

    使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。

    分布式应用

    Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。

    但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。

    减少数据库压力

    这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。

    我考虑的一种简单方法:

    后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。

    Memcache的安全

    我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

    内网访问

    最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。

    # memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid

    Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接。

    设置防火墙

    防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。

    view sourceprint?

    1# iptables -F
    2# iptables -P INPUT DROP
    3# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
    4# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT

    上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

     

     

     

     

     

    Memcache::pconnect()和 Memcache::connect()非常类似,不同点在于这里建立的连接是持久化的。这个连接不会在脚本执行结束后或者Memcache::close()被调用后关闭。同样你也可以使用函数memcache_pconnect()。

    关于Memcache的长连接是如何重用的,这是一个网友的解释“persistent为false时的表现是很好理解的,请求来了就连接。请求完毕就关闭对Memcache Server的连接。至于 persistent为true的情况,处理也是比较简单的。一个Memcache的连接hash值主要跟host、port以及timeout有关。有一个连接请求到来时就根据host和port生成一个hash值,然后查表。有则取出,没有则新建一个连接,新建后放入连接池。请求关闭时并不关闭对Memcache Server的连接,而是把这个连接(在做一些状态更新后)放入连接池(就是前面提到的那个hash 表),供下次查询使用。”Memcache的长连接(pconnect)开销较小,但是占用TCP端口。

    connect
    Memcache::connect()建立一个到memcached服务端的连接。 使用方法 Memcache::connect()打开的连接在脚本执行结束后会自动关闭。当然,你也可以使用方法 Memcache::close()来主动关闭。 同时你也可以使用 memcache_connect()函数来获取一个连接。

    Memcached的连接数
    登录到Memcache Server查看服务器的状态

    1
    2

     telnet 127.0.0.1 11211
     stats

    得到如下结果

    STAT pid 23193
    STAT uptime 5846159
    STAT time 1350869831
    STAT version 1.4.9
    STAT libevent 1.4.13-stable
    STAT pointer_size 64
    STAT rusage_user 18130.632724
    STAT rusage_system 53822.121793
    STAT curr_connections 2048
    STAT total_connections 98471150
    STAT connection_structures 2383
    STAT reserved_fds 20
    STAT cmd_get 3570290772
    STAT cmd_set 98386836
    STAT cmd_flush 2
    STAT cmd_touch 0
    STAT get_hits 2697025276
    STAT get_misses 873265496
    STAT delete_misses 6124562
    STAT delete_hits 26956415
    STAT incr_misses 0
    STAT incr_hits 0
    STAT decr_misses 0
    STAT decr_hits 0
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 138982259474
    STAT bytes_written 3052329831433
    STAT limit_maxbytes 8589934592
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 2322
    STAT hash_power_level 21
    STAT hash_bytes 16777216
    STAT hash_is_expanding 0
    STAT expired_unfetched 743266
    STAT evicted_unfetched 0
    STAT bytes 1109591787
    STAT curr_items 2343667
    STAT total_items 98338176
    STAT evictions 0
    STAT reclaimed 1492847
    END
    

    发现当前打开着的连接数(curr_connections)已经达到了上限2048,而命中率 = get_hits/cmd_get * 100 = 75.54% 这个效率已经相当低了,Memcached最大同时连接数默认是1024,增加最大连接数命中率应该会有所改变。

    关于PHP使用Memcache的详细参数和示例推荐这篇文章:php操作memcache的使用测试总结
    关于Memcached的全面解析,这里有几篇翻译不错的文章
    也顺便推荐下一个不错的Memcached图形化管理监控工具:MemAdmin

    展开全文
  • 1.购买阿里云Memcache; 2.引入对应的sdk类文件;实例化调用 function login_form_password() { if (empty($this->data['admin'])) { return ['code' => 1, 'msg' => '请输入正确的用户...
    场景:一个pos机需要多个账号信息登录;同时不能挤掉别人.

    1.购买阿里云Memcache;

    2.引入对应的sdk类文件;实例化调用

    function login_form_password()
    {
        if (empty($this->data['admin'])) {
            return ['code' => 1, 'msg' => '请输入正确的用户登陆名'];
        }
        if (empty($this->data['password'])) {
            return array("code" => 1, "msg" => "参数错误或者缺少");
        }
        if (empty($this->data['platform']) || !in_array($this->data['platform'], ["android", "ios", "pc", "wx", 'wxxcx'])) {
            return array("code" => 1, "msg" => 'platform ' . "参数错误或者缺少");
        }
        $admin = $this->DB('slave1')->get(TABLE_MERCHANT_USER, ['admin_id', "admin_pwd", 'store_id'], ["admin_account" => $this->data['admin']]);
        if (MD5($this->data['password'] . APISECRET) == $admin['admin_pwd']) {
            $oMucache = new mucache(false);
            //修改数据库 商家登录的最新时间
            $this->DB('master')->update(TABLE_MERCHANT_USER, [
                'pos_last_login' => date('Y-m-d H:i:s')
            ], [
                'admin_id' => $admin['admin_id']
            ]);
            $token = $this->generateNum();
            $ok = $oMucache->set($admin['admin_id'] . '|' . $this->data['platform'], $token, 7200);
            if ($ok === true) {
                //前端获取到token进行解析,然后想访问后台接口必须携带
                return array("code" => 0, "token" => base64_encode(($admin['admin_id'] + 139188800) . "|" . $token . "|" . $admin['store_id']));
            }
        }
        return array("code" => 1, "msg" => "身份识别失败");
    }

    3.memcache类中要传入相应的配置

     

    展开全文
  • memcache课程---4、php+memcache如何让用户跨域登录 一、总结 一句话总结: 让所有服务器共用一台memcache缓存,即可达到跨域的目的 1、session跨域:修改php配置文件,使session保存到memcache服务器上去,这样...

    memcache课程---4、php+memcache如何让用户跨域登录

    一、总结

    一句话总结:

    让所有服务器共用一台memcache缓存,即可达到跨域的目的
    1、session跨域:修改php配置文件,使session保存到memcache服务器上去,这样登录的话session信息就保存到memcache服务器上面去了;不同服务器修改的php的配置文件都指向同一个memcache服务器,比如tcp://192.168.20.1:11211
    2、cookie跨域:因为cookie里面带sessionid,默认不是本人带正确的卡不认,所以可以在跨域的入口链接中带上sessionid

     

    php怎么把session存到memcache服务器上面去(这样可以实现session跨域)
    php.ini配置文件修改(支持memcache) 
    session.save_handler = memcache 
    session.save_path = "tcp://192.168.20.1:11211“
    
    
    cookie跨域如何实现(cookie默认是相当于本人带正确的卡才得行)
    本质是通过memcache保存且共享了session_id信息
    1、强制在跨域的入口链接中带上了session_name()这个参数,所以可以$_GET取
    2、在memcache中根据session_name()对应的session_id取session数据即可(先存了)
    3、将这个session_id存入cookie,便于网站的不同位置需要sessionid的时候使用

     

     

     

    1、memcache用户跨域登录解决的是什么问题(举例)?

    不同服务器上请求资源:网站既向linux服务器请求资源,又向windows服务器请求资源,默认情况登录的session不共享,所以用户需要登录多次很麻烦

     

    2、php怎么把session存到memcache服务器上面去(这样可以实现session跨域)?

    不同服务器修改php.ini配置文件已支持memcache
    session.save_handler = memcache
    session.save_path = "tcp://192.168.20.1:11211“

     

    3、php默认把session存为什么文件,放在哪?

    到php的配置文件中去找session
    默认是存为文件:session.save_handler = files
    存储地址:session.save_path="D:\software\coding\php\phpstudy\PHPTutorial\tmp\tmp"

     

    4、cookie跨域如何实现(cookie默认是相当于本人带正确的卡才得行)?

    本质是通过memcache保存且共享了session_id信息,来找到session的信息
    1、强制在跨域的入口链接中带上了session_name()这个参数,所以可以$_GET取
    2、在memcache中根据session_name()对应的session_id取session数据即可(先存了)
    3、将这个session_id存入cookie,便于网站的不同位置需要sessionid的时候使用
    项目入口文件设置
    $mem=new Memcache;
    $mem->connect("192.168.20.1","10000"); 
    $sessid=$_GET[session_name()];//强制在链接中带上了这个参数,所以可以$_GET取
    $_SESSION=$mem->get($sessid.'_data');
    setcookie(session_name(),$sessid,0,'/');//比如linux除了进门需要卡号,其它位置也需要,所以存进session
    
    
    存session_id到memcache服务器
    $mem=new Memcache;
    $mem->connect("192.168.20.1","10000")
    $mem->set(session_id().'_data',$_SESSION);

     

     

     

     

    二、内容在总结中

     

     

     

     

    转载于:https://www.cnblogs.com/Renyi-Fan/p/10924642.html

    展开全文
  • 主要介绍了MVC使用Memcache+Cookie解决分布式系统共享登录状态学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Memcache监控工具 -- memcachephpmemcachephp是一款memcache图形界面的监控工具,可以通过这个工具查看到局域网内所有部署memcache机器或者端口的memcache的运行情况,对我们监控memcache的缓存命中率、cache利用率...
  • 采用分布式缓存Memcache模拟Session进行用户信息信息共享 1、视图部分 @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>XX商城后台管理系统登录</title> ...
  • Memcache服务

    2018-05-06 11:38:09
    1、memcached在项目中的作用和益弊1.1、作用a、作Web服务或移动端的页面缓存快速读取数据,减轻磁盘存储(比如Mysql、ES)服务的压力b、跨域登录 严格地说,不是跨越,而是跨一个域中的不同主机,现象就是当用户在...
  • memcache安装

    千次阅读 2011-07-04 04:01:23
    转载自 http://zhaochen.blog.51cto.com/2029597/390037 一,memcache简单介绍: memcached是高性能的分布式内存缓存服务器,为了提高性能,memcached中的数据都保存在内存中,重启mem
  • 分布式memcache

    2017-07-06 15:10:14
    连接memcache服务器$mem=new Memcache;$mem->addServer("192.168.0.1","11211");2.增$mem->set('name','user1');3.删$mem->delete('name');4.改$mem->set('age',200);5.查echo $mem-...
  • memcache课程---1、memcache介绍及安装(memcache作用) 一、总结 一句话总结: 减少对数据库的访问,因为数据库的访问比较花费时间 1、memcache为什么比操作数据库快的...2.跨域登录 3、memcache缺点 是什...
  • memcache监控

    千次阅读 2012-08-06 15:27:53
    一、从php官方下载memcache的扩展包,下载...如我们下载:memcache-3.0.4.tgz 解压后得到:memcache.php 打开memcache.php,设置上帐号、密码、连接信息 $VERSION='$Id: memcache.php,v 1.1.2.3 2008/09/11 19:23
  • Memcache监控工具 -- ...memcachephp是一款memcache图形界面的监控工具,可以通过这个工具查看到局域网内所有部署memcache机器或者端口的memcache的运行情况,对我们监控memcache的缓存命中率、cache利用率、
  • Memcache学习

    千次阅读 2013-05-01 15:04:58
    1、win下安装,memcached -d install win下启动,memcached -d start 关闭,memcached -d stop 1_1、三种方式访问memcache memcache ...2、memcache扩展(函数)===...安装memcache扩展(C编译的动态链接库)
  • memcache学习笔记

    2018-10-11 16:20:47
    memcache学习笔记 文章目录memcache学习笔记1. 安装与连接2. 设置与删除数据缓存周期问题3. 其他指令(incr、decr、stats)4. php操作memcached4.1 macos安装php扩展4.2 数据操作4.3 应用5. 数据类型6. 分布式缓存服务...
  • 使用Memcache实现Session共享(单点登录)的原理
  • C#操作Memcache

    2015-11-10 16:13:22
    软件从单机到分布式 走向分布式就要解决:多台机器共享登录信息的...memcache 是一个分布式的缓存系统,但是本身没有提供集群功能,数据也是键值对存储Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程
  • session 入memcache

    2018-06-02 09:00:27
    废话不多说 看代码ini_set('session.save_handler','memcache'); ini_set('session.save_path','127.0.0.1:11211'); session_start(); $session = $_SESSION['name'] = 'xiaoxiaochengxuyuan'; $memcache = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,690
精华内容 5,476
关键字:

memcache登录