php session不起作用的解決辦法:首先在頁面的開始處調(diào)用“session_save_path()”函數(shù);然后把保存session的目錄指向一個(gè)專用的目錄即可。
推薦:《PHP視頻教程》
php Session失效的原因
最近公司的項(xiàng)目出現(xiàn)了一個(gè)Session失效的問題,程序運(yùn)行之后,session不到幾分鐘就失效了。后來在網(wǎng)上看了很久,了解了它的機(jī)理:Session在lunix里面是存儲(chǔ)在公共的路徑里面,這就會(huì)導(dǎo)致一個(gè)問題,如果程序里面有很多的Session應(yīng)用,就會(huì)相互的影響。
后來我嘗試修改session.gc_maxlifetime 但是我發(fā)現(xiàn)這個(gè)參數(shù)基本不起作用。在默認(rèn)情況下,PHP 中的session信息會(huì)以文本文件的形式,被保存在系統(tǒng)的臨時(shí)文件目錄中。這個(gè)路徑由配置參數(shù)session.save_path指定。在Linux下,這一路徑通常為tmp,在 Windows下通常為C:WindowsTemp。當(dāng)服務(wù)器上有多個(gè)PHP應(yīng)用時(shí),它們會(huì)把自己的session文件都保存在同一個(gè)目錄中(因?yàn)樗鼈兪褂猛粋€(gè)session.save_path參數(shù))。同樣地,這些PHP應(yīng)用也會(huì)按一定機(jī)率啟動(dòng)GC,掃描所有的session文件。
問題在于,GC在工作時(shí),并不會(huì)區(qū)分不同站點(diǎn)的session。舉例言之,站點(diǎn)A的gc_maxlifetime設(shè)置為2小時(shí),站點(diǎn)B的 gc_maxlifetime設(shè)置為默認(rèn)的24分鐘。當(dāng)站點(diǎn)B的GC啟動(dòng)時(shí),它會(huì)掃描公用的臨時(shí)文件目錄,把所有超過24分鐘的session文件全部刪除掉,而不管它們來自于站點(diǎn)A或B。這樣,站點(diǎn)A的gc_maxlifetime設(shè)置就形同虛設(shè)了。
所以具體操作就是每個(gè)項(xiàng)目擁有自己的session路徑,找到問題所在,解決起來就很簡(jiǎn)單了。在頁面的開始處調(diào)用session_save_path()函數(shù),它能夠修改session.save_path參數(shù),把保存session的目錄指向一個(gè)專用的目錄,例如tmpmyapp。這樣,gc_maxlifetime參數(shù)就工作正常了。
具體代碼:
session_start(); ini_set('session.save_path','/tmp/'); //6個(gè)鐘頭 ini_set('session.gc_maxlifetime',21600); //保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/");