您好,登錄后才能下訂單哦!
這篇文章主要介紹如何解決php中session不起作用的問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
php session不起作用的解決辦法:首先打開php的配置文件;然后找到session相關的配置項;接著新建session 文件,并設置權限;最后重新上傳文件即可。
解決 php 項目中 session 失效的方法
今天下班坐班車,快到站的時候,上家公司的 leader 發了個 qq 給我,意思是救火,下車后回來在電腦上詳細問了下,leader 的描述如下
這個地址 你幫我看下 為啥上傳完試卷發布任務 設置答題卡的時候 session 就沒了
因為這個項目一開始后臺都是我一人開發的,因此很快就找到了問題所在。流程為:用戶通過 js 組件上傳試卷,在上傳試卷的方法中通過 session 存儲剛剛上傳的試卷詳細信息,如名稱、后綴、存入資源表的 ID 等,上傳成功后,再點擊頁面上的其他選項,如學校、年級、難易度等,最后點擊提交,在提交處理的方法里,一開始便判斷剛剛上傳的 session 值是否存在,不存在便跳到試卷首頁。我在此方法中打印了 $_SESSION,沒有值,奇怪了,以前還是好好的。于是我問了下,啥時候開始的,leader 說下午快下班時,老師打電話說上傳試卷設置答題卡不成功,老跳轉。接著又問了下,動服務器環境了么,leader 說沒有。
既然出現了問題,那就解決問題唄。正好這段時間在看《PHP 核心技術與最佳實踐》一書,里面就對 session 和 cookie 有詳細的描述,同時也加深了我對二者的理解。于是我先打開 php 的配置文件,找到 session 相關的配置項,發現 session.save_path為 /data2/session,我記得以前都是設置為 /data1/session 的,怎么變了。于是我退出來去看看此路徑,一開始我以為是該目錄權限不夠,后來一看,壓根就沒有該目錄,難怪每個 session 不會跨頁面。于是新建文件,設置權限,再上傳,一切又恢復正常了。
寫到這,我也想再嘮叨下 session 相關的技術點。session 是存儲在服務器端的,默認是以文件方式存儲的(session.save_handler = files)。那 session 是如何產生的呢?session 是通過 session_start() 函數產生的 ,當此函數運行時,在 session 存儲的目錄里生成一個文件和唯一一個與之對應的 session id,通過 session id 可以取出該 session 文件的數據。由于每次運行 session_start() 都會產生新的 seession 文件,那么如何利用到以前生成 session 文件呢,只需 session_id($session_id),那么便不會新產生 session 文件了,而會去讀 session id 對應的 session 文件。session id 在默認情況下都是使用在客戶端(瀏覽器)的 cookie 來保存 session id(在 chrome 瀏覽器上按 F12 鍵,點擊 Resources-cookies,可以看到),使用 $_COOKIE['PHPSESSID'] 可以獲取。那個PHPSESSID是session id 的默認名稱,在 php.ini 里可以通過 session.name 來設置,在腳本中用 session_name() 來獲取 session id 的名稱。每次瀏覽器和服務器對話時,瀏覽器都會把 session id 傳給服務器的,服務器會依據傳遞過來的 session id 找到相應的 session 文件獲取相應信息進行相關操作。而一旦客戶端(瀏覽器)禁用了 cookie,那么服務器端變不會接收到 session id,此時需要顯示傳遞 session id 了。兩種方法:手動通過 URL 傳遞 session id;隱藏表單傳遞 session id。上述兩種方法需要服務端的 php 環境中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);
代碼都看懂的吧,就不解釋了。
最后總結下吧,一般情況下出現跨頁面 session 失效,基本上是上述列出的幾點。1、session.save_path 有誤,如權限不夠,或是目錄不存在;2、服務器php配置中的 session.use_trans_sid 值為 0;3、客戶端禁用了cookie。不過我覺得第一種情況出現的頻率應該挺高的。
【updated 2018-05-21】
周五晚上上線,又踩了個坑。框架是用 CI , session 寫入 MySQL 表。一開始表現形式和上面描述的癥狀一模一樣,于是便重新設置了 seesion 的目錄,并賦予了相關的讀寫權限,然并卵。后來發現該表是個 memory 表,以為是超出了內存表最大值,于是清空了該表,還是然并卵。最后對比了下兩個版本的差異,發現在保存 session 的時候新增了兩個字段,于是采用排除法,先把兩個都注釋了,然后一個一個打開,最后定位到了問題。原來,新增的一個值是用來保存一個類型表的所有值的,一開始在做測試時,只有幾個值,后來上線時新增了一百多個值,同時那個字段只有 3000 大小,應該是撐爆了。于是先把該字段調大,讓線上驗證,然后改了下相關邏輯,不把表的所有值都寫進去。
以上是如何解決php中session不起作用的問題的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。