最近自己所計畫的專案,打算使用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
接著,在找到
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"
格式:
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 來儲存 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 .... 的問題
這個問題其實有點詭異,aidec在這邊卡超久的。怎麼說呢?從字面上看這個錯誤訊息是寫說出現認證錯誤,
等同於是告訴我們密碼錯了,但是我使用 php redis 直接連線卻發現是可以連線的。(密碼沒錯啊)
上網爬了許多文章都沒有答案,自己也嘗試了各種方法,後來採用session custom handler 發現到竟然可以用
但想來想去總覺得很怪,不死心的我,又再次測試如果不要使用密碼的話,可否連線的上呢? 答案是 可以的
這個結果讓我肯定問題確確實實是出在密碼這個環節,於是便重複測試各種密碼,最終得到了一個結論!!
問題的原因是出現在原本的 密碼當中含有[ # ]井字號,經過實測 英文字、數字、符號( @$! ) 都是可以使用的
好吧~ 為了這個 # 字號,耗掉了我 1~2小時的時間 = =
文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)
原文連結:
https://blog.aidec.tw/post/php-redis-session
若有業務合作需求,可寫信至: opweb666@gmail.com
創業、網站經營相關內容未來將發布在 小易創業筆記