首頁 >後端開發 >PHP問題 >php session不起作用怎麼辦

php session不起作用怎麼辦

藏色散人
藏色散人原創
2020-09-28 09:04:143388瀏覽

php session不起作用的解決方案:先開啟php的設定檔;然後找到session相關的設定項;接著新建session 文件,並設定權限;最後重新上傳檔案即可。

php session不起作用怎麼辦

推薦:《PHP影片教學

解決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[&#39;arr&#39;] = array(&#39;name&#39; => &#39;molaifeng&#39;, &#39;hobby&#39; => &#39;php&#39;);
?>
<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不起作用怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn