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

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

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

解決方案: session

  1. 寫入SESSION後,儘早使用 session_write_close() 進行解鎖,好比在a.php的sleep以前添加一行session_write_close();
  2. 使用內存等無鎖方案,好比儲存到MemCached、MySql中
  3. 使用Cookie保存到客戶端,用戶信息能夠加密後寫到Cookie中,好比使用TEA等輕量級的加密方案。
相關文章
相關標籤/搜索