在集群環境中,使用redis可以更靈活地實現負載均衡。
原生session在服務器上是以文件的形式存儲的,所以其有一些磁盤io上的缺點
說“原生的session要比使用redis來存儲session更好”的說話是沒有道理的。而且session還存在以下問題:
由于session回收的問題,使用session還會帶來一些像登錄會話不能準時過期等問題。
在使用swoole做websocket服務器的時候,在嘗試使用session_id來獲取原生session的會話信息的時候,由于原生session總是需要配合session_start()使用,在嘗試在處理請求session_start()的時候會報“header already sent”的問題;嘗試使用sessionHandler類的方法時,也會報告一些奇怪的問題。
因此沒必要守著原生session這老古董,應該積極擁抱redis存儲會話的方式
## 最簡單的通過redis管理session的配置方式
在php.ini里實現如下配置
~~~
[Session]
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?database=3"
~~~
這樣就可以在不對原有的業務代碼做任何修改的情況下,完成原生session向redis session的遷移。在分布式環境中,通過配置redis集群或主庫,也可以方便地解決一致性或同步的問題。
使用redis來管理session還有一個優勢,可以更快更方便地直接處理用戶的session數據。使用原生session的時候,想要在非用戶請求的進程中獲取指定phpsessionid用戶的session數據是比較麻煩的,使用php自帶的一些session操作方式都需要session_start,因為不是用戶的請求進程,執行session_start總是會遇到各種奇怪的問題。
將session交給redis管理之后,問題就簡單多了,可以直接通過get key為
PHPREDIS_SESSION:PHPSESSIONID
的redis數據,就可以取到session中的內容。
因為session里的數據有一些自己的特殊處理,直接使用unserialize是不能解析出數據來下,下附解析出session中數據的
~~~
static function unserialize_php($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
if (!strstr(substr($session_data, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
}
$pos = strpos($session_data, "|", $offset);
$num = $pos - $offset;
$varname = substr($session_data, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
~~~
使用這個方法的前提是在php.ini中配置的
session.serialize_handler=php
如果是別的handler,比如binary,得使用不同的解析方式,這里就不列出了,可以自行google。
- 簡介
- Cookie
- HTML5 LocalStorage
- session
- 當瀏覽器關閉后,Session就銷毀了嗎?
- mysql數據庫保存session
- HTTP協議的由來
- fsockopen異步請求
- http防盜鏈
- Apache偽靜態知識補充
- 大并發量解決方案
- 大型網站是怎樣解決多用戶高并發訪問
- 網站高并發 大流量訪問的處理及解決方法
- 并發數與在線客戶數?注冊用戶數的關系
- 即時聊天程序
- 反向Ajax實現
- ob緩存作用
- 淺聊并發之戰
- php擴展安裝
- php安裝redis擴展
- SQLMap自動化實施SQL注入共計
- 命名空間namespace
- 集群和分布式之【session共享】
- php Redis存儲Session 【1】
- php Redis存儲Session 【2】
- php mysql存儲session【1】
- php緩存
- 文件緩存
- memcache和redis的比較
- 原生session與session in redis對比
- XSS攻擊【1】
- XSS攻擊【2】
- PHP消息隊列
- php+mysql 模擬發送郵件隊列
- php+mysql 模擬訂單處理隊列
- php+redis 模擬秒殺隊列
- RabbitMQ 消息隊列系統
- beanstalkd
- PHP構建即時通訊
- WebSocket協議
- workerman
- PHP變量的作用域
- PHP傳值和傳引用的區別
- PHP匿名函數
- PHP遞歸函數&應用
- PHP單例模式
- PHP性能優化
- RESTful
- 集群
- 增加pgsql擴展
- php.ini路徑查找
- Swoole Compiler
- mysql 主從
- 主從
- mysql-proxy
- window docker環境