php Redis存储Session的例子详解
安装redis服务以及php redis扩展
一:redis安装
Download, extract and compile Redis with:
$ wget http://download.redis.io/releases/redis-3.0.4.tar.gz
$ tar xzf redis-3.0.4.tar.gz
$ cd redis-3.0.4
$ make
The binaries that are now compiled are available in the src directory. Run Redis with:
$ src/redis-server
You can interact with Redis using the built-in client:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
More:http://www.redis.io/download
二、php扩展:
更多版本:http://pecl.php.net/package/redis
wget http://pecl.php.net/get/redis-2.2.5.tgz
#解压
tar zxvf redis-2.2.5.tgz
#进入安装目录
cd redis-2.2.5
/usr/local/php/bin/phpize
#配置
./configure --with-php-config=/usr/local/php/bin/php-config
#编译安装
make && make install
安装完成之后,出现下面的安装路径
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
配置php支持
#编辑配置文件,在最后一行添加以下内容
vim /usr/local/php/etc/php.ini
extension="redis.so"
这个时候phpinfo()就可以看到redis扩展了。
redis小例子:
$redis = new redis();
$test=$redis->connect('127.0.0.1', 6379);
var_dump($test);
$result = $redis->set('test',"111cn.net");
var_dump($result); //结果:bool(true)
$result = $redis->get('test');
var_dump($result); //结果:string(11) "111cn.net"
修改php.ini的设置
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
修改后重启php-fpm,phpinfo()可以查看到session存储在redis中。
如果不想修改php.ini,可在代码中加入:
ini_set("session.save_handler","redis");
ini_set("session.save_path","tcp://127.0.0.1:6379");
如果redis.conf设置了连接密码(requirepass),session的save_path需修改为:tcp://127.0.0.1:6379?auth=requirepass的值。
如果选择redis数据库,session.save_path = "tcp://xx.xx.xx.xx:6789?database=11",诸如此类。
查看redis存储session的值:
<?php
session_start();
$_SESSION['sessionid'] = 'www.111cn.net';
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
//redis用 PHPREDIS_SESSION: 加 session_id 作为key,并且是以string的形式存储
echo $redis->get('PHPREDIS_SESSION:' . session_id()); //输出www.111cn.net
?>
在网上看到有人质疑redis存储session值会有并发一致性的问题(文件存储session有文件锁来处理),这块没有研究。
连接MYSQL数据库的方法有许多了其实我们只要使用不同的连接函数与接口即可实现了,下面给各位整理三种PHP连接MYSQL数据库的常用方法,希望文章对各位有用.
代码如下 | 复制代码 |
$mysql_server="localhost";
$mysql_username="数据库用户名"; $mysql_password="数据库密码"; $mysql_database="数据库名"; //建立数据库链接 $conn = mysql_connect($mysql_server,$mysql_username,$mysql_password) or die("数据库链接错误"); //选择某个数据库 mysql_select_db($mysql_database,$conn); mysql_query("set names 'utf8'"); //执行MySQL语句 $result=mysql_query("SELECT id,name FROM 数据库表"); //提取数据 $row=mysql_fetch_row($result); |
代码如下 | 复制代码 |
$db=new mysqli($dbhost,$username,$userpass,$dbdatabase);
if(mysqli_connect_error()){ echo 'Could not connect to database.'; exit; } $result=$db->query("SELECT id,name FROM user");
$row=$result->fetch_row(); |
代码如下 | 复制代码 |
$dsn='mysql:host='.$dbhost.';dbname='.$dbdatabase.';'
$dbh=new PDO($dsn,$username,$userpass); $stmt=$dbh->query('SELECT id,name FROM user');
$row=$stmt->fetch(); |
最近使用PHP数据库访问最新的一种技术 POD,不封装,代码也写得很少。 下面我将贴出我的代码。
代码部分:
<?php $dsn = "mysql:host=localhost;dbname=mysqldatabasedemo"; $db = new PDO($dsn,'root','123456@#',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES'GBK';")); $someInParameter1='hellow'; $stmt = $db->prepare("CALL outputProcudure(:addName,@outASD)"); $stmt->bindParam(':addName', $someInParameter1); if($stmt->execute()) { $rs=$db->query('select @outASD')->fetchAll(); $dataArray=$rs[0]; echo("<script type='text/javascript'> alert('"+$dataArray[0]+"');</script>"); } else { echo("<script type='text/javascript'> alert('插入失败');</script>"); } ?>
mysql存储过程:
PHP_PDO 调用mysql 带返回参数的存储过程
DROP PROCEDURE IF EXISTS pro_test; create procedure pro_test(in val VARCHAR(50) ,out rtn int) begin declare err INT default 0; -- 如果出现异常,会自动处理并rollback declare exit handler for sqlexception ROLLBACK ;
-- 启动事务 start transaction;
insert into test_user values(NULL,1,'啊是大三的'); -- set err = @@IDENTITY; -- = 获取上一次插入的自增ID; set err =last_insert_id(); -- 获取上一次插入的自增ID insert into test_user VALUES(NULL,val,err); -- 运行没有异常,提交事务 commit; -- 设置返回值为1 set rtn=1; end;
$name = '成都市'; $stmt = $db->prepare("CALL pro_test(?,@sp_result);"); $stmt->bindParam(1, $name); $stmt->execute (); $outputArray = $db->query("select @sp_result")->fetch(PDO::FETCH_ASSOC);
<span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">print_r($outputArray["@sp_result"]);</span>
一台Memcache通常不能满足我们的需求,这就需要分布式部署。Memcached分布式部署方案通常会采用两种方式,一种是普通Hash分布,一种是一致性Hash分布。本篇将以PHP作为客户端,来分析两种方案。
一、普通Hash分布:
<?php
function test($key='name'){
$md5 = substr(md5($key), 0, 8);
$seed = 31;
$hash = 0;
for($i=0; $i<8; $i++){
$hash = $hash * $seed + ord($md5[$i]);
}
return $hash & 0x7FFFFFFF;
}
$memcacheList = array(
array('host'=>'192.168.1.2', 'port'=>6379),
array('host'=>'192.168.1.3', 'port'=>6379),
array('host'=>'192.168.1.4', 'port'=>6379),
array('host'=>'192.168.1.5', 'port'=>6379),
);
$key = 'username';
$value = 'lane';
//根据KEY获取hash
$hash = $this->test($key);
$count = count($memcacheList);
$memcache = $memcacheList[$hash % $count];
$mc = new Memcached($memcache);
$mc->set($key, $value);
?>
代码很简单,一个Hash函数,根据所需要的key,将他md5后取前8位,然后经过Hash算法返回一个整数。将这个整数对服务器总数求模。得到的就是服务器列表的编号。这种方式的缺点是服务器数量改变后,同一个key不同hash,将取不到值了。
二、一致性Hash分布
一致性Hash尽管也会造成数据的丢失,但是损失是最小的。
将2的32次方-1想象成一个圆环,服务器列表在上面排列。根据key通过hash算法求得在圆环上的位置,那么所需要的服务器的位置在key的位置前面最近的一个(顺时针)。
<?php
class FlexiHash{
//服务器列表
private $serverList = array();
//是否排序
private $isSort = false;
/**
* Description: Hash函数,将传入的key以整数形式返回
* @param string $key
* @return int
*/
private function myHash($key){
$md5 = substr(md5($key), 0, 8);
$seed = 31;
$hash = 0;
for($i=0; $i<8; $i++){
$hash = $hash * $seed + ord($md5[$i]);
}
return $hash & 0x7FFFFFFF;
}
/**
* Description: 添加新服务器
* @param $server
*/
public function addServer($server){
$hash = $this->myHash($server);
if(!isset($this->serverList[$hash])){
$this->serverList[$hash] = $server;
}
$this->isSort = false;
return true;
}
/**
* Description: 删除指定服务器
* @param $server
* @return bool
*/
public function removeServer($server){
$hash = $this->myHash($server);
if(isset($this->serverList[$hash])){
unset($this->serverList[$hash]);
}
$this->isSort = false;
return true;
}
/**
* Description: 根据要操作的KEY返回一个操作的服务器信息
* @param $key
* @return mixed
*/
public function lookup($key){
//将指定的KEYhash出一个整数
$hash = $this->myHash($key);
if($this->isSort !== true){
krsort($this->serverList);
$this->isSort = false;
}
foreach($this->serverList as $key=>$server){
if($key <= $hash){
return $server;
}
}
return array_pop($this->serverList);
}
}
//使用方法
$mc = new FlexiHash();
$mc->addServer('192.168.1.2');
$mc->addServer('192.168.1.3');
$mc->addServer('192.168.1.4');
$mc->addServer('192.168.1.5');
echo 'KEY=key1时,操作的服务器为:'.$mc->lookup('key1').'<br>';
echo 'KEY=key1时,操作的服务器为:'.$mc->lookup('key2').'<br>';
echo 'KEY=key1时,操作的服务器为:'.$mc->lookup('key3').'<br>';
echo 'KEY=key1时,操作的服务器为:'.$mc->lookup('key4').'<br>';
echo 'KEY=key1时,操作的服务器为:'.$mc->lookup('key5').'<br>';
?>
相关文章
PHP session_start()很慢问题分析与解决办法
本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25- 这篇文章主要介绍了Vue基于localStorage存储信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-16
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- 这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
Python3使用Selenium获取session和token方法详解
这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17- floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
- 参考:http://stackoverflow.com/questions/412341/how-should-i-store-guid-in-mysql-tables通常用UUID做唯一标识,需要在数据库中进行存储。UUID的格式 复制代码 代码如下: String string = UUID.randomUUID().toStrin...2015-03-15
- session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
- session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
- 这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
- PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。 1. 错误提示 引用 代...2016-11-25
- 要设置php生存有效时间我们可以利用session_set_cookie_params函数或修改php.ini文件哦,下面小编来介绍一下。 第一种方法:session_set_cookie_params 函数原型 voi...2016-11-25
- 下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
- 这篇文章主要介绍了JS变量存储深拷贝和浅拷贝,想深入了解JS的同学,可以参考下...2021-05-04
jQuery ajax全局函数处理session过期后的ajax跳转问题
这篇文章主要介绍了基于jQuery的全局ajax函数处理session过期后的ajax操作的相关资料,需要的朋友可以参考下...2016-06-12jsp使用sessionScope获取session案例详解
这篇文章主要介绍了jsp使用sessionScope获取session案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-29- 这篇文章主要为大家详细介绍了C++实现数据文件存储与加载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25