溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決php中session不起作用的問(wèn)題

發(fā)布時(shí)間:2020-09-29 15:39:02 來(lái)源:億速云 閱讀:302 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹如何解決php中session不起作用的問(wèn)題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

php session不起作用的解決辦法:首先打開php的配置文件;然后找到session相關(guān)的配置項(xiàng);接著新建session 文件,并設(shè)置權(quán)限;最后重新上傳文件即可。

解決 php 項(xiàng)目中 session 失效的方法

今天下班坐班車,快到站的時(shí)候,上家公司的 leader 發(fā)了個(gè) qq 給我,意思是救火,下車后回來(lái)在電腦上詳細(xì)問(wèn)了下,leader 的描述如下

這個(gè)地址  你幫我看下 為啥上傳完試卷發(fā)布任務(wù)  設(shè)置答題卡的時(shí)候  session 就沒(méi)了

因?yàn)檫@個(gè)項(xiàng)目一開始后臺(tái)都是我一人開發(fā)的,因此很快就找到了問(wèn)題所在。流程為:用戶通過(guò) js 組件上傳試卷,在上傳試卷的方法中通過(guò) session 存儲(chǔ)剛剛上傳的試卷詳細(xì)信息,如名稱、后綴、存入資源表的 ID 等,上傳成功后,再點(diǎn)擊頁(yè)面上的其他選項(xiàng),如學(xué)校、年級(jí)、難易度等,最后點(diǎn)擊提交,在提交處理的方法里,一開始便判斷剛剛上傳的 session 值是否存在,不存在便跳到試卷首頁(yè)。我在此方法中打印了 $_SESSION,沒(méi)有值,奇怪了,以前還是好好的。于是我問(wèn)了下,啥時(shí)候開始的,leader 說(shuō)下午快下班時(shí),老師打電話說(shuō)上傳試卷設(shè)置答題卡不成功,老跳轉(zhuǎn)。接著又問(wèn)了下,動(dòng)服務(wù)器環(huán)境了么,leader 說(shuō)沒(méi)有。

既然出現(xiàn)了問(wèn)題,那就解決問(wèn)題唄。正好這段時(shí)間在看《PHP 核心技術(shù)與最佳實(shí)踐》一書,里面就對(duì) session 和 cookie 有詳細(xì)的描述,同時(shí)也加深了我對(duì)二者的理解。于是我先打開 php 的配置文件,找到 session 相關(guān)的配置項(xiàng),發(fā)現(xiàn) session.save_path為 /data2/session,我記得以前都是設(shè)置為 /data1/session 的,怎么變了。于是我退出來(lái)去看看此路徑,一開始我以為是該目錄權(quán)限不夠,后來(lái)一看,壓根就沒(méi)有該目錄,難怪每個(gè) session 不會(huì)跨頁(yè)面。于是新建文件,設(shè)置權(quán)限,再上傳,一切又恢復(fù)正常了。

寫到這,我也想再嘮叨下 session 相關(guān)的技術(shù)點(diǎn)。session 是存儲(chǔ)在服務(wù)器端的,默認(rèn)是以文件方式存儲(chǔ)的(session.save_handler = files)。那 session 是如何產(chǎn)生的呢?session 是通過(guò) session_start() 函數(shù)產(chǎn)生的 ,當(dāng)此函數(shù)運(yùn)行時(shí),在 session 存儲(chǔ)的目錄里生成一個(gè)文件和唯一一個(gè)與之對(duì)應(yīng)的 session id,通過(guò) session id 可以取出該 session 文件的數(shù)據(jù)。由于每次運(yùn)行 session_start() 都會(huì)產(chǎn)生新的 seession 文件,那么如何利用到以前生成 session 文件呢,只需 session_id($session_id),那么便不會(huì)新產(chǎn)生 session 文件了,而會(huì)去讀 session id 對(duì)應(yīng)的 session 文件。session id 在默認(rèn)情況下都是使用在客戶端(瀏覽器)的 cookie 來(lái)保存 session id(在 chrome 瀏覽器上按 F12 鍵,點(diǎn)擊 Resources-cookies,可以看到),使用 $_COOKIE['PHPSESSID'] 可以獲取。那個(gè)PHPSESSID是session id 的默認(rèn)名稱,在 php.ini 里可以通過(guò) session.name 來(lái)設(shè)置,在腳本中用 session_name() 來(lái)獲取 session id 的名稱。每次瀏覽器和服務(wù)器對(duì)話時(shí),瀏覽器都會(huì)把 session id 傳給服務(wù)器的,服務(wù)器會(huì)依據(jù)傳遞過(guò)來(lái)的 session id 找到相應(yīng)的 session 文件獲取相應(yīng)信息進(jìn)行相關(guān)操作。而一旦客戶端(瀏覽器)禁用了 cookie,那么服務(wù)器端變不會(huì)接收到 session id,此時(shí)需要顯示傳遞 session id 了。兩種方法:手動(dòng)通過(guò) URL 傳遞 session id;隱藏表單傳遞 session id。上述兩種方法需要服務(wù)端的 php 環(huán)境中session.use_trans_sid 值為 1。

啰嗦了那么多,最后還是 linus 那句話,“talk is cheap,show me the code”。

<?php
session_start();
$_SESSION['arr'] = array('name' => 'molaifeng', 'hobby' => 'php');
?>
<a href="testSession.php?<?php echo session_name(); ?>=<?php echo session_id()?>">testSession</a>
<?php
 
session_start($_REQUEST[session_name()]);
print_r($_SESSION);

代碼都看懂的吧,就不解釋了。

最后總結(jié)下吧,一般情況下出現(xiàn)跨頁(yè)面 session 失效,基本上是上述列出的幾點(diǎn)。1、session.save_path 有誤,如權(quán)限不夠,或是目錄不存在;2、服務(wù)器php配置中的 session.use_trans_sid 值為 0;3、客戶端禁用了cookie。不過(guò)我覺(jué)得第一種情況出現(xiàn)的頻率應(yīng)該挺高的。

【updated 2018-05-21】

周五晚上上線,又踩了個(gè)坑??蚣苁怯?CI , session 寫入 MySQL 表。一開始表現(xiàn)形式和上面描述的癥狀一模一樣,于是便重新設(shè)置了 seesion 的目錄,并賦予了相關(guān)的讀寫權(quán)限,然并卵。后來(lái)發(fā)現(xiàn)該表是個(gè) memory 表,以為是超出了內(nèi)存表最大值,于是清空了該表,還是然并卵。最后對(duì)比了下兩個(gè)版本的差異,發(fā)現(xiàn)在保存 session 的時(shí)候新增了兩個(gè)字段,于是采用排除法,先把兩個(gè)都注釋了,然后一個(gè)一個(gè)打開,最后定位到了問(wèn)題。原來(lái),新增的一個(gè)值是用來(lái)保存一個(gè)類型表的所有值的,一開始在做測(cè)試時(shí),只有幾個(gè)值,后來(lái)上線時(shí)新增了一百多個(gè)值,同時(shí)那個(gè)字段只有 3000 大小,應(yīng)該是撐爆了。于是先把該字段調(diào)大,讓線上驗(yàn)證,然后改了下相關(guān)邏輯,不把表的所有值都寫進(jìn)去。

以上是如何解決php中session不起作用的問(wèn)題的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI