php Session無效分析資料整理_php實例
php Session無效分析
PHP開發過程中,可能有朋友經常會遇到Session所產生的文件無法自動清除的問題,其實並非真的無法清除,而是有一個概率問題,只要你的站點訪問量足夠大,那些文件就可以自動被清除掉。如果訪問量比較少,又看那些文件不順眼的話,只要在php.ini裡的配置一下即可實現Session文件自動清除的功能,具體配置如下:
找到
session.gc_probability = 1
session.gc_divisor = 1000
上面這兩個參數其實就是這個機率,預設是1/1000
將 session.gc_divisor = 1000 改為 session.gc_divisor = 100 即可
如果想達到完全的實時,那麼可以把這個參數改為1,這樣機率就是100%了
看看session如何運作的
概述:每次php請求,會有1/100的機率(預設值)觸發「session回收」。如果「session回收」發生,那就會檢查/tmp/sess_*的文件,如果最後的修改時間到現在超過了1440秒(gc_maxlifetime的值),就將其刪除,意味著這些session過期失效。
1. session在server端(一般是Apache with PHP module)如何存在的?
預設的,php會將session保存在/tmp目錄下,檔案名稱為這個樣子:sess_01aab840166fd1dc253e3b4a3f0b8381。每一個檔案對應了一個session(會話)。
more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381 username|s:9:”jiangfeng”;admin|s:1:”0〃;
#變數名稱|型別:長度:值
刪除這裡的session文件,就表示對應的session失效了。
2. session在client端(通常是瀏覽器)如何存在的?
session在瀏覽器端,只需要儲存session ID(由server端產生的唯一ID)就可以了。有兩種儲存方式:在cookie中、在url裡面。如果cookie中儲存session ID,就可以看到瀏覽器的cookie中有一個PHPSESID變數。如果是URL傳遞的,就可以看到形如:
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381的URL。 (在server端透過session.use_cookies來控制使用哪一種方式)
3. 在server端,php如何判斷session檔案是否過期?
如果」最後的修改時間」到」現在」超過了gc_maxlifetime(預設是1440)秒,這個session檔案就被認為是過期了,在下一次session回收的時候,如果這個檔案仍然沒有被更改過,這個session檔案就會被刪除(session就過期了)。
簡單的說,如果我登入某網站,如果在1440秒(預設值)內沒有操作過,那麼對應的session就認為是過期了。
所以,修改php.ini檔案中的gc_maxlifetime變數就可以延長session的過期時間了:(例如,我們把過期時間修改為86400秒)
session.gc_maxlifetime = 86400
然後,重啟你的web服務(一般是apache)就可以了。
注意:php5裡面session過期使用了回收機制。這裡設定時間為86400秒,如果session在86400秒內沒有被修改過,那麼在下一次「回收」時才真的被刪除。
4. session「回收」何時發生?
預設情況下,每一次php請求,就會有1/100的機率發生回收,所以可能簡單的理解為「每100次php請求就有一次回收發生」。這個機率是透過以下參數控制的
#機率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
注意1:假設這種情況gc_maxlifetime=120,如果某個session檔案最後修改時間是120秒之前,那麼在下一次回收(1/100的機率)發生前,這個session仍然是有效的。
注意2:如果你的session使用session.save_path中使用別的地方保存session,session回收機制有可能不會自動處理過期session檔。這時需要定時手動(或crontab)的刪除過期的session:
cd /path/to/sessions; find -cmin +24 | xargs rm
5. 一些特殊情況
因為回收機制會檢查檔案的“最後修改時間”,所以如果某個會話是活躍的,但是session的內容沒有改變過,那麼對應的session檔案也就沒有改變過,回收機制會認為這是一個長時間沒有活躍的session而將其刪除。這是我們不願意看到的,可以透過增加如下的簡單程式碼來解決這個問題:
<?php if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60) $_SESSION['last_access'] = time(); ?>
代码会每隔60秒,尝试修改修改一次session。
总结:如果想修改session过期时间,修改变量gc_maxlifetime就可以了。php5的session采用被动的回收机制(garbage collection)。过期的session文件不会自己消失,而是通过触发“回收”来处理过期的session。
我们下面来详细看看一些其它的设置session时间的问题
Session 过期时间参数
设定过期时间参数, 主要是设定 session.gc_maxlifetime 的参数即可, 再保险一点的设定, 就设定下面这两个参数.
ini_set('session.cookie_lifetime', 0); // 可用 print_r(session_get_cookie_params()); 观察 ini_set('session.gc_maxlifetime', 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 观察
session_cookie_lifetime 设为 0 的话, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相关的)
如果懒得想这些, 直接用下面的 function 就可以了
Session 过期时间程式
<?php function start_session($expire = 0) { if ($expire == 0) { $expire = ini_get('session.gc_maxlifetime'); } else { ini_set('session.gc_maxlifetime', $expire); } if (empty($_COOKIE['PHPSESSID'])) { session_set_cookie_params($expire); session_start(); } else { session_start(); setcookie('PHPSESSID', session_id(), time() + $expire); } } ?>
使用方式
于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start())
如果要再延长过期时间, 只要再做修改即可.
但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。
