解決PHP 服務器以文件儲存 SESSION 的兩個問題
在默認情況下,我們在服務器上的SESSION是以文件儲存的,這種情況至少到帶來兩個問題:
- 在高并發或銷毀時間較長的情況下,在SESSION目錄下產生大量文件。這會導致兩個問題:第一、查找文件慢;第二,每個目錄下可容納的文件數是有限的,可能會導致新SESSION儲存失敗。
- 在SESSION初始化時,會鎖住文件,直到程序執行完畢才釋放,導致其它并發的腳本在初始化SESSION時產生阻塞。這意味著其它的腳本都在等待這個鎖,從而產生性能問題。
這兩個問題隨便發生一個,都是不可接受的,如果產生了疊加效果,則更恐怖。
以下兩個腳本是證實問題2的依據:
<?php // a.php session_start(); $_SESSION['MYNAME'] = 'HEIING'; sleep(10); // 睡10秒,以便觀察,通常這里是一些數據庫及業務邏輯操作 echo 'done';
<?php // b.php session_start(); echo $_SESSION['MYNAME']; echo "\ndone";先運行a.php,再運行b.php,會發現阻塞。
解決方案:
- 寫入SESSION后,盡早使用 session_write_close() 進行解鎖,比如在a.php的sleep之前添加一行session_write_close();
- 使用內存等無鎖方案,比如儲存到MemCached、MySql中
- 使用Cookie保存到客戶端,用戶信息可以加密后寫到Cookie中,比如使用TEA等輕量級的加密方案。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!