在本地用thinkphp的驗(yàn)證碼擴(kuò)展測(cè)試沒(méi)問(wèn)題莉恼,放到Linux服務(wù)器之后囚枪,總是提示驗(yàn)證碼錯(cuò)誤发笔,以下是我的解決方案,希望能幫到其他人
thinkphp的驗(yàn)證碼原理就是后端生成驗(yàn)證碼吝羞,在前端將驗(yàn)證碼顯示出來(lái)兰伤,至于前端和后端的驗(yàn)證比較,是后端生成的驗(yàn)證碼加密后通過(guò)session傳遞钧排。
本地正常使用敦腔,放到服務(wù)器無(wú)法使用,肯定不是代碼的問(wèn)題恨溜,應(yīng)該是是服務(wù)器的問(wèn)題符衔,而且很有可能是session出問(wèn)題了。
至于具體原因因人而異筒捺,我是因?yàn)?PHP通過(guò)外部命令函數(shù)執(zhí)行shell腳本時(shí)一些特殊命令需要root權(quán)限柏腻,所以之前配置更改過(guò)PHP的執(zhí)行用戶(hù)而導(dǎo)致session不可用纸厉。
首先確認(rèn)你session文件的存放位置系吭,然后確認(rèn)地址存在,并且PHP的執(zhí)行用戶(hù)對(duì)該文件夾有權(quán)限颗品。網(wǎng)上有一種說(shuō)法是修改PHP的配置文件中的 session.save_path
的值肯尺,然而我沒(méi)改明白~,我是直接查了當(dāng)前session文件的位置躯枢,然后修改文件夾所有者或直接修改文件夾權(quán)限则吟。
通過(guò)在服務(wù)器運(yùn)行以下代碼查看session文件的存放位置:
原文鏈接
$sessionpath = session_save_path();
if (strpos ($sessionpath, ";") !== FALSE)
$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
//獲取當(dāng)前session的保存路徑
echo $sessionpath;
這樣就得到了你的session文件的具體位置,然后去查看該文件夾是否存在以及文件夾的權(quán)限問(wèn)題锄蹂。
附:通過(guò)在服務(wù)器執(zhí)行以下代碼查看PHP的執(zhí)行用戶(hù)(一般為apache或nobody)
system("whoami");
這樣輸出的就是你PHP的執(zhí)行用戶(hù)氓仲,然后再看該用戶(hù)對(duì)以上輸出的session文件是否有讀寫(xiě)權(quán)限。