php連接redis
❶ php怎麼將數據導入redis
對於大訪問量的站點使用默認的Session 並不合適,我們可以將其存入資料庫、或者使用Redis KEY-VALUE數據存儲方案
首先新建一個session表
CREATE TABLE `sessions` (
`sid` char(40) NOT NULL,
`updatetime` int(20) NOT NULL,
`data` varchar(200) NOT NULL,
UNIQUE KEY `sid` (`sid`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
Mysql 的memory引擎採用內存表,所有數據存儲在內存,操作速度快
復制代碼
<?php
//引入資料庫文件
include "db.php";
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
private $sessData;
public $expiretime; //設置過期時間
public $db; //資料庫
public function __construct($hanlder =''){
$this->db = Database::getInstance();
//獲取資料庫實力
///var_mp($this->db);
}
public function open($savePath, $sessionName)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
$sql ="select * from sessions where sid ='$id'";
$result = $this->db->execute($sql);
if(!empty($result)){
return $this->sessData = $result;
}
}
//函數的參數 $id -> 當前會話ID
//數據DATA -> 序列化之後的字元串
public function write($id, $data)
{
// echo $id;
// echo $data;
$now = time();
$newExp = $now+$this->expiretime; //總時間=當前時間 + 期限時間
$sql = "select * from sessions where sid ='$id'";
$result = $this->db->getOne($sql);
//var_mp($result);
if($data==''||isset($data)){
$data = $this->sessData;
}
if($result){
//如果存在則更新
$sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
//echo $sql;
$update_data =$this->db->execute($sql);
if($update_data){
return true;
}
}else{
//不存在則生成生成
$sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
$insert_data = $this->db->execute($sql);
if($insert_data){
return true;
}
}
return false;
}
public function destroy($id)
{ //銷毀
$sql = "delete from sessions where sid="."$id";
$destory = $this->db->execute($sql);
if($destory){
return true;
}else{
return false;
}
}
public function gc($sessMaxLifeTime)
{
$t = time();
$sql ="delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}";
$data = $this->db->execute($this->tosql);
if($data){
return true;
}else{
return false;
}
return true;
}
}
復制代碼
實例化
此處 PHP 手冊可以有兩種方法
1,實現了SessionHandlerInterface借口的對象,自PHP5.4可以使用
2 ,直接使用 session_set_save_handler
復制代碼
//判斷PHP版本
if(version_compare(PHP_VERSION,5.4)==1){
session_set_save_handler($handler, true);
session_start();
}else{
ini_set('session.use_trans_sid',0);
ini_set('session.use_cookies',1);
ini_set('session.cookie_path','/');
ini_set('session.save_handler','user');
session_mole_name('user');
session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc"));
session_start();
}
$_SESSION['QQ']="QQ";
echo $_SESSION['QQ'];
復制代碼
資料庫代碼 db.php
復制代碼
<?php
class Database{
static $instance;
static $db;
static function getInstance(){
if(self::$instance){
return self::$instance;
}else{
return new Database();
}
}
public function __construct(){
self::$db = new PDO('mysql:host=localhost;dbname=session', 'root','');
}
public function getOne($sql){
$rs =self::$db->query($sql);
@$rs->setFetchMode(PDO::FETCH_ASSOC);//返回關聯數組
$result = $rs -> fetch();
return $result;
}
public function execute($sql){
$rs = self::$db->exec($sql);
return $rs;
}
}
//$data = Database::getInstance();
//var_mp($data);
復制代碼
使用REDIS 存儲SESSION
復制代碼
<?php
class SessionManager{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime = 30;
public function __construct(){
$this->redis = new Redis();
$this->redis->connect('127.0.0.1',6379); //連接redis
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destory"),
array($this,"gc")
);
session_start();
}
public function open($path,$name){
return true;
}
public function close(){
return true;
}
public function read($id){
$value = $this->redis->get($id);
if($value){
return $value;
}else{
return "";
}
}
public function write($id,$data){
if($this->redis->set($id,$data)){
$this->redis->expire($id,$this->sessionExpireTime);
//設置過期時間
return true;
}
return false;
}
public function destory($id){
if($this->redis->delete($id)){
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
//析構函數
public function __destruct(){
session_write_close();
}
}
$re = new SessionManager();
$_SESSION['name'] = "qq";
echo $_SESSION['name'];
❷ PHP怎麼設置鏈接redis的超時時間
$this->redis->connect($host, $port,3); 3秒連接超時
$this->redis = new Redis();
$this->redis->connect($host, $port);
$this->redis->auth($auth);
這樣解決就可以了,簡單粗暴
❸ php redis 需要使用單例嗎
<?php
/**
* Class RedisConnManager
*
* 單例模式對redis實例的操作的進一步封裝
* 主要目的:防止過多的連接,一個頁面只能存在一個聲明連接
*
* @author :cuihuan
*/
class RedisManager
{
private static $redisInstance;
/**
* 私有化構造函數
* 原因:防止外界調用構造新的對象
*/
private function __construct(){}
/**
* 獲取redis連接的唯一出口
*/
static public function getRedisConn(){
if(!self::$redisInstance instanceof self){
self::$redisInstance = new self;
}
// 獲取當前單例
$temp = self::$redisInstance;
// 調用私有化方法
return $temp->connRedis();
}
/**
* 連接ocean 上的redis的私有化方法
* @return Redis
*/
static private function connRedis()
{
try {
$redis_ocean = new Redis();
$redis_ocean->connect(G::$conf['redis-host'], G::$conf['redis-port']);
$redis_ocean->auth(G::$conf['redis-pass']);
}catch (Exception $e){
echo $e->getMessage().'<br/>';
}
return $redis_ocean;
}
}
❹ PHP怎麼設置鏈接redis的超時時間
$this-redis-connect($host, $port,3); 3秒連接超時
$this-redis = new Redis();
$this-redis-connect($host, $port);
$this-redis-auth($auth);
這樣解決就可以了,簡單粗暴,個人建議還是去後盾網去經常看看教學視頻學習學習吧
❺ thinkphp在控制器連接redis時報錯
1.在配置項中定義:
12345'SESSION_TYPE' => 'Redis', //session保存類型'SESSION_PREFIX' => 'sess_', //session前綴'REDIS_HOST' => '127.0.0.1' //REDIS伺服器地址'REDIS_PORT' => 6379, //REDIS連接埠號'SESSION_EXPIRE' => 3600, //SESSION過期時間
2.在ThinkPHP\Library\Think\Session\Driver目錄下新建Redis.class.php文件
文件內容如下:
<?phpnamespace Think\Session\Driver;class Redis {// Redis連接對象 private $redis;// Session過期時間 private $expire; /** * 打開方法 * @param type $path * @param type $name * @return type */ public function open($path, $name) { $this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxLifetime'); $this->redis = new Redis(); return $this->redis->connect(C('REDIS_HOST'), C('REDIS_PORT')); } /** * 關閉 * @return type */ public function close() { return $this->redis->close(); } /** * 讀取 * @param string $id * @return type */ public function read($id) { $id = C('SESSION_PREFIX') . $id; $data = $this->redis->get($id); return $data ? $data : ''; } /** * 寫入 * @param string $id * @param type $data * @return type */ public function write($id, $data) { $id = C('SESSION_PREFIX') . $id; return $this->redis->set($id, $data, $this->expire); } /** * 銷毀 * @param string $id */ public function destroy($id) { $id = C('SESSION_PREFIX') . $id; $this->redis->delete($id); } /** * 垃圾回收 * @param type $maxLifeTime * @return boolean */ public function gc($maxLifeTime) { return true; }}
memcached的方法和Redis差不多一樣!
❻ php連接redis失敗怎麼能
你得同時 將redis伺服器打開,我也是調試了一下午,網路沒結果。結果發現得cmd redis-server 同時將 redis伺服器打開 , 然後再試試redis測試語句,就行了。。或者你多去後盾人.看看,興許能有不一樣的收獲
❼ PHP怎麼設置鏈接redis的超時時間
$this-redis-connect($host, $port,3); 3秒連接超時
$this-redis = new Redis();
$this-redis-connect($host, $port);
$this-redis-auth($auth);
這樣解決就可以了,簡單粗暴,個人建議還是去後盾網去經常看看教學視頻學習學習吧
❽ php每一次調用redis都需要連接redis嗎
redis連接的時候有 connect 和 pconnect 兩種
connect:腳本結束之後連接就釋放了。
pconnect:腳本結束之後連接不釋放,連接保持在php-fpm進程中。
總結:所以使用pconnect代替connect,可以減少頻繁建立redis連接的消耗。
❾ php連接redis總是提示超時
伺服器上的連接把IP改成本地IP:127.0.0.1試試看。