php ?redis,PHP使用Redis存儲Session

對于大訪問量的網站來說,會有許多的客戶端和服務端建立鏈接,就會生成許多 Session 文件,由于 Session 文件是存儲在硬盤上的,因此每次服務器去讀取這些 Session 文件都要經過許多的 I/O 操作。

PHP 中可使用 session_set_save_handle() 函數自定義 Session 保存函數(如打開、關閉、寫入、讀取等),其語法如下:

bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] )

如果想使用 PHP 內置的會話存儲機制之外的方式,可以使用本函數。例如,可以自定義會話存儲函數來將會話數據存儲到數據庫。

該函數的參數說明如下:

open(string$savePath,string$sessionName)

open 回調函數類似于類的構造函數,在會話打開的時候被調用。這是自動開始會話或者通過調用 session_start() 手動開始會話之后第一個被調用的回調函數。

此回調函數操作成功返回 true,反之返回 false。

close()

close 回調函數類似于類的析構函數。在 write 回調函數調用之后調用。當調用 session_write_close() 函數之后,也會調用 close 回調函數。

此回調函數操作成功返回 true,反之返回 false。

read(string$sessionId)

如果會話中有數據,那么 read 回調函數必須返回將會話數據編碼(序列化)后的字符串。如果會話中沒有數據,read 回調函數就返回空字符串。

在自動開始會話或者通過調用 session_start() 函數手動開始會話之后,PHP 內部調用 read 回調函數來獲取會話數據。在調用 read 之前,PHP 會調用 open 回調函數。

read 回調返回的序列化之后的字符串格式必須與 write 回調函數保存數據時的格式完全一致。PHP 會自動反序列化返回的字符串并填充 $_SESSION 超級全局變量。雖然數據看起來和 serialize() 函數很相似,但是它們是不同的。

write(string$sessionId,string$data)

在會話保存數據時會調用 write 回調函數。此回調函數接收當前會話 ID 以及 $_SESSION 中數據序列化之后的字符串作為參數。

序列化會話數據的過程由 PHP 根據 session.serialize_handler 設定值來完成。序列化后的數據將和會話 ID 關聯在一起進行保存。當調用 read 回調函數獲取數據時,所返回的數據必須和傳入 write 回調函數的數據完全保持一致。PHP 會在腳本執行完畢或調用 session_write_close() 函數之后調用此回調函數。

注意,在調用完此回調函數之后,PHP 內部會調用 close 回調函數。

PHP 會在輸出流寫入完畢并且關閉之后才調用 write 回調函數,所以在 write 回調函數中的調試信息不會輸出到瀏覽器中。如果需要在 write 回調函數中使用調試輸出,建議將調試輸出寫入到文件。

destroy($sessionId)

當調用 session_destroy() 函數,或者調用 session_regenerate_id() 函數并且設置 destroy 參數為 true 時會調用此回調函數。

此回調函數操作成功返回 true,反之返回 false。

gc($lifetime)

為了清理會話中的舊數據,PHP 會不時地調用垃圾收集回調函數。調用周期由 session.gc_probability 和 session.gc_divisor 參數控制。傳入到此回調函數的 lifetime 參數由 session.gc_maxlifetime 設置。

此回調函數操作成功返回 true,反之返回 false。

create_sid()

當需要新的會話 ID 時被調用的回調函數。回調函數被調用時無傳入參數,其返回值應該是一個字符串格式的、有效的會話 ID。

PHP 使用 Redis 來存儲 Session

下面舉一個關于使用 Redis 代替文件存儲 Session 的例子。

首先編寫一個管理 Session 的類 sessionmanager,代碼如下:

class sessionmanager{

private $redis;

private $sessionsavepath;

private $sessionname;

public function __construct(){

$this->redis = new Redis();

$this->redis->connect('10.116.19.14',6400);

$reval = session_set_save_handler(

array($this,"open"),

array($this,"close"),

array($this,"read"),

array($this,"write"),

array($this,"destroy"),

array($this,"gc")

);

session_start();

}

public function open($patn,$name){

return true;

}

public function close(){

return true;

}

public function read($id){

$value = $this->redis->get($id);

if($value) {

return $value;

} else {

return false;

}

}

public function write($id,$data){

if($this->redis->set($id,$data)) {

$this->redis->expire($id,60);

return true;

} else {

return false;

}

}

public function destroy($id) {

if($this->redis->delete($id)) {

return true;

}

return false;

}

public function gc($maxlifetime){

return true;

}

public function __destruct(){

session_write_close();

//TODO: Implement __destruct() method.

}

}

?>

將以上代碼保存為 sessionmanager.php 文件。

在該類的構造函數中,使用 session_set_save_handler() 設置 Session 的處理函數,實例化該類時便完成了用指定函數接管系統處理 Session 的工作。

在 write 回調函數中,以傳入的 sessionID 作為 key,以 Session 的值作為 redis 中 key 的值存入 Redis,并設置過期時間為 60 秒;read 方法以傳入的 sessionID 為 key 從 Redis 取出相應的 Session 值。destroy 可根據傳入的 sessionID 刪除 Redis 中的 Session。

我們編寫另外一個設置 Session 的腳本,并引入 sessionmanager.php 文件,實例化 sessionmanager 類,代碼如下:

include 'sessionmanager.php';

new sessionmanager();

$_SESSION['namehaha'] = 'lixiaolong';

$_SESSION['namehah'] = 'lixiaolong';

$_SESSION['namehaa'] = 'lixiaolong';

$_SESSION['namhaha'] = 'lixiaolong';

$_SESSION['namhaha'] = array('a'=>1,2,3,4,4);

?>

保存以上代碼為 set.php,另外編寫一個可訪問 Session 的腳本,代碼如下:

include 'sessionmanager.php';

new sessionmanager();

var_dump($_SESSION);

?>

保存以上代碼為 get.php 文件。測試時先訪問 set.php,再訪問 get.php,會在瀏覽器中輸出以下結果:

array(4)

{

["namehaha"]=> string(10) "lixiaolong"

["namehah"]=> string(10) "lixiaolong"

["namehaa"]=> string(10) "lixiaolong"

["namhaha"]=> array(5)

{

["a"]=> int(1)

[0]=> int(2)

[1]=> int(3)

[2]=> int(4)

[3]=> int(4)

}

}

可見已經成功地設置并獲得了 Session。查看 redis 中存儲的 Session 信息:

redis 127.0.0.1:6400> get ruevh62hlm809d1p2lg2o0fbv7

"namehaha|s:10:\"lixiaolong\";namehah|s:10:\"lixiaolong\"; namehaa|s:10:\"lixiaolong\";namhaha|a:5:{s:1:\"a\";i:1;i:0;i:2;i:1;i:3;i:2;i:4;i:3;i:4;}"

redis 中是以 string 的數據類型存儲 Session 的,其 key 便是 sessionID,也是 HTTP Request 中的 cookie 名為 PHPSESSID 的值。Session 在 redis 和文件中的存儲形式是一樣的,只不過在 redis 中對雙引號做了轉義而已。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信支付現金紅包接口(轉)

微信支付現金紅包接口正式開放,只需開通微信支付,即可接入現金紅包。通過現金紅包接口,公眾號開發者可以策劃相關運營活動,向用戶發放微信支付現金紅包,更好的達到品牌推廣及回饋用戶的效果。具體能力如下:…

php 打印對象到文件,php實現將數組或對象寫入到文件的方法小結【三種方法】...

本文實例講述了php實現將數組或對象寫入到文件的方法。分享給大家供大家參考,具體如下:php將數組或對象原樣寫入或保存到文件有三種方法可以實現第一種方法是使用serialize,第二種方法是使用print_r,第三種方法是使用var_export&a…

The return types for the following stored procedures could not be detected

1、使用dbml映射數據庫,添加存儲過程到dbml文件時報錯。 2、原因:存儲過程中使用了臨時表 3、解決方案 3.1 通過自定義表值變量實現 Ex: DECLARE TempTable TABLE ( AttributeID INT, Value NVARCHAR(200) ) INSERT INTO TempTable Select * from Attrib…

webstock php,workerman_connection

workerman_connection 測試WebStock 功能Description整理PHP 實現webstock 功能的相關流程。感謝workerman 開發作者提供開源組件。安裝 composer# curl -sS https://getcomposer.org/installer | php如果安裝 composer 提示PHP 版本不夠按照如下處理,否則跳過。提示…

短信通信的幾種情況和CMS錯誤

1. 如何與GSM MODEM建立通信聯系 2. 不能與GSM MODEM進行正常的通信或總是在仿真終端上出現亂碼 3. 如何才能知道錯誤代碼 4. 發送短消息后,收到出錯信息CMS ERROR 512 5. 發送短消息后,收到出錯…

php+管道+pipe管道,angular2+管道pipe

一.什么是Pipe?就是管道,簡單來說,管道的作用就是傳輸。并且不同的管道具有不同的作用。(其實就是處理數據)二.pipe用法{{ 輸入數據 | 管道 : 管道參數}} (其中‘|’是管道操作符)三.Angular自帶的pipe函數管道功能DatePipe 日期管道,格式…

[字符串]與[數組]的互相轉換

1.字符串轉換為數組 var a"1,2,3";var ba.split(,); 2.數組轉換為字符串 var c[1,2,3];var dc.join(,); 轉載于:https://www.cnblogs.com/zqzjs/p/4693849.html

java android 界面設計,Android精美登錄界面設計

在網上在到一個登錄界面感覺挺不錯的,給大家分享一下~先看效果圖:這個Demo除了按鈕、小貓和Logo是圖片素材之外,其余的UI都是通過代碼實現的。一、背景背景藍色漸變,是通過一個xml文件來設置的。代碼如下:background_l…

linux查看文件大小

du -s [文件名] du -sh [文件名] ls -lh [文件名]轉載于:https://www.cnblogs.com/chenqionghe/p/4694070.html

jmeter java接口,jmeter并發測試java接口 | 學步園

Sample這里我用到主要JMeter的線程和報表,擴展了他的“Java請求”這個應用類別。要擴展此應用,要用到lib/ext/ApacheJMeter_java.jar,他封裝此應用。首先,需要繼承ApacheJMeter_java.jar中的抽象類AbstractJavaSamplerClient,它提…

Web項目練習總結(錯誤校正篇)

老師布置任務,從SVN上弄個項目來練練手,熟悉下過程。 myeclipse安裝SVN 然后把MobileManageSys下下來 然后漫長的等待。。。 然后配置數據庫,導入,這里用的是SQLyog,其他的也可以 之后這里會產生一大堆的錯誤&#xff…

php 網格,PHP中的數據網格

你可以使用http://phpgrid.com$dg new C_DataGrid("SELECT * FROM orders", "orderNumber", "orders");// change column titles$dg->set_col_title("orderNumber", "Order No.");$dg->set_col_title("orderDat…

matlab常用隸屬度函數,常用隸屬函數.ppt

模糊集基本理論 典型隸屬函數 如前所述, 構造恰當的隸屬函數是模糊集理論應用的基礎。一種基本的構造隸屬函數的方法是“參考函數法”, 即參考一些典型的隸屬函數, 通過選擇適當的參數, 或通過擬合、整合、實驗等手段得到需要的隸屬函數。 下面介紹典型隸屬函數(最早由法國學者…

適配器模式的應用

1.適配源類:java.util.Properties 2.適配目標類:FileIO 3.適配器 FileProperties package fileio;import java.io.IOException;public interface FileIO {public void readFromFile(String fileName) throws IOException;public void writeToFile(String…

nginx php7提速,nginx+php7-fpm 性能提升幾倍跟蹤實踐結果并優化

nginxphp7-fpm 性能提升幾倍跟蹤實踐結果并優化nginxphp7-fpm 性能提升幾倍,跟蹤實踐結果并優化歷史ubuntu服務器使用的apachephp5,現在使用nginuxphp7-fpm方式,看效果圖,啥也不說了。強烈推薦升級到php7,當然升級中基…

Where條件的in里面放太多數據導致很慢

比如:select * from TableA where ID in (42,216,219,230,231,220,249,250,221,251,252,217,253,255,256,254,257,258,1804) 52W數據,查詢速度19386ms,好慢怎么辦?程序都卡死了。 那么試一下百度搜索到的優化方式? 1.將…

inur new.php id,Cmsez(隨易)全站系統注入0day

allinurl:"owered by CMSEZ" comments.php inurlowered by CMSEZ//commentsinclude "mainfile.php";$artnew article();//設定$confirmyes;//yes:需要管理員認證后才能顯示,no:直接顯示$membernew member();$user_info$member->member_auth();$ulevel$u…

matlab地球衛星模型,地球衛星三維運行軌道MATLAB仿真

地球衛星三維運行軌道MATLAB仿真1、問題的描述3 軌道上運行的地球衛星,根據牛頓第二定律Fma以及萬有引力定律F-GmME*r/r,3可得a-GME*r/r,即x -GME*x/r3 3 y -GME*y/r; z -GM*z/r3E (1)式中,(x,y,z)表示衛星…

LeetCode 3. Longest Substring Without Repeating Characters

原題鏈接在這里:https://leetcode.com/problems/longest-substring-without-repeating-characters/ 題目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repea…

The mook jong 計數DP

The mook jong ZJiaQ為了強身健體,決定通過木人樁練習武術。ZJiaQ希望把木人樁擺在自家的那個由1*1的地磚鋪成的1*n的院子里。由于ZJiaQ是個強迫癥,所以他要把一個木人樁正好擺在一個地磚上,由于木人樁手比較長,所以兩個木人樁之間…