最近自己所計畫的專案,打算使用redis作為php的session以便於多個服務可以透過redis來共享session。可以有效的解決不同服務放在不同伺服器的問題。


上網查了一下,發現可以使用 php 內建的 session handler 來實現將session改成使用redis的模式保存。 而且只需要簡單的幾個步驟就可以了。


一.設定session handler

這邊可以用兩種方式來實現,一種是修改 php.ini 檔案,另一種是直接使用 ini_set() 函數。

方法一: 修改php.ini

找到 php.ini 文件當中的 (大約在1297行附近)

session.save_handler = files

修改成

session.save_handler = redis

redis_session-1.PNG

接著,在找到

session.save_path = "/tmp"

修改成

session.save_path = "tcp://190.102.152.74:6379"

如果redis有設定密碼的話則修改成

session.save_path = "tcp://190.102.152.74:6379?auth=aaaa1234"

如果有多組

session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5"

redis_session-2.PNG

格式:

  tcp://ip位置:port?auth=您的密碼&weight=1&timeout=2&persistent=1&prefix=redissession

auth : 密碼

weight : 權重 (多組時可設定這個)

timeout : 超時時間

persistent : 是否持久連線 (1.是 0.否)

prefix : 保存在redis的session名稱前綴詞

詳細參考 https://github.com/phpredis/phpredis#php-session-handler

方法二: 修改ini_set

在頁面的開始 添加

ini_set('session.save_handler', 'redis');

ini_set('session.save_path', 'tcp://190.102.152.74:6379?auth=aaaa1234');

session_start();

redis_session-3.PNG


設定完畢後,將伺服器重新啟動一下便可以使用redis 來儲存 php session 。 


解決問題

這邊提一下在設定時有可能會遇到的問題。

(一).連線遠端redis 

如果要連線遠端的redis 必須修改 redis.conf 文件

找到 

bind 127.0.0.1

修改成

bind 0.0.0.0

保存後,重新啟動 redis (以centos7為例)

systemctl restart redis

(二).解決出現 Failed to AUTH connection in .... 的問題

redis_error1.PNG

這個問題其實有點詭異,aidec在這邊卡超久的。怎麼說呢?從字面上看這個錯誤訊息是寫說出現認證錯誤,

等同於是告訴我們密碼錯了,但是我使用 php redis 直接連線卻發現是可以連線的。(密碼沒錯啊)

上網爬了許多文章都沒有答案,自己也嘗試了各種方法,後來採用session custom handler 發現到竟然可以用


但想來想去總覺得很怪,不死心的我,又再次測試如果不要使用密碼的話,可否連線的上呢? 答案是 可以的

這個結果讓我肯定問題確確實實是出在密碼這個環節,於是便重複測試各種密碼,最終得到了一個結論!!

問題的原因是出現在原本的 密碼當中含有[ # ]井字號,經過實測 英文字、數字、符號( @$! ) 都是可以使用的


好吧~ 為了這個 # 字號,耗掉了我 1~2小時的時間 = =

 





文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)

原文連結:
https://blog.aidec.tw/post/php-redis-session