解決PHP 服務器以文件儲存 SESSION 的兩個問題

jopen 11年前發布 | 23K 次閱讀 PHP PHP開發

在默認情況下,我們在服務器上的SESSION是以文件儲存的,這種情況至少到帶來兩個問題:

  1. 在高并發或銷毀時間較長的情況下,在SESSION目錄下產生大量文件。這會導致兩個問題:第一、查找文件慢;第二,每個目錄下可容納的文件數是有限的,可能會導致新SESSION儲存失敗。
  2. 在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,會發現阻塞。

解決方案:

  1. 寫入SESSION后,盡早使用 session_write_close() 進行解鎖,比如在a.php的sleep之前添加一行session_write_close();
  2. 使用內存等無鎖方案,比如儲存到MemCached、MySql中
  3. 使用Cookie保存到客戶端,用戶信息可以加密后寫到Cookie中,比如使用TEA等輕量級的加密方案。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!