避免此問題的一種方法是讓PHP將會話存儲在數據庫表中而不是文件中。
首先,我會給你幾個環節,作爲該解決方案真正的學分:
http://www.tonymarston.net/php-mysql/session-handler.html
http://shiflett.org/articles/storing-sessions-in-a-database
http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/
然後,代碼實現,我從這些讀數得出:
<?php
class TLB_Sessions_in_Database
{
private $debug;
private $dbc;
function __construct()
{
$this->debug = false;
session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_clean')
);
}
function _open()
{
if($this->debug) echo '_open:'.PHP_EOL;
if(($this->dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) !== false)
{
$select_db = mysql_select_db(DB_NAME, $this->dbc);
$set_charset = mysql_set_charset(DB_CHARSET, $this->dbc);
if($this->debug) echo '- return: '.(($select_db && $set_charset) ? 'true' : 'false').PHP_EOL;
return($select_db && $set_charset);
}
else
{
if($this->debug) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return(false);
}
function _close()
{
if($this->debug) echo '_close:'.PHP_EOL;
return(mysql_close($this->dbc));
}
function _read($session_id)
{
if($this->debug) echo '_read:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$sql = "SELECT `session_data` FROM `".DB_NAME."`.`php_sessions` WHERE `session_id` = '".$session_id."'";
if($this->debug) echo '- query: '.$sql.PHP_EOL;
if(($result = mysql_query($sql, $this->dbc)) !== false)
{
if(!in_array(mysql_num_rows($result), array(0, false), true))
{
$record = mysql_fetch_assoc($result);
return($record['session_data']);
}
}
else
{
if($this->debug) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return('');
}
function _write($session_id, $session_data)
{
if($this->debug) echo '_write:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$session_data = mysql_real_escape_string($session_data);
//$sql = "REPLACE INTO `php_sessions` (`session_id`, `last_updated`, `session_data`) VALUES ('".$session_id."', '".time()."', '".$session_data."')";
$sql = "INSERT INTO `".DB_NAME."`.`php_sessions` (`session_id`, `date_created`, `session_data`) VALUES ('".$session_id."', NOW(), '".$session_data."') ON DUPLICATE KEY UPDATE `last_updated` = NOW(), `session_data` = '".$session_data."'";
if(($result = mysql_query($sql, $this->dbc)) === false)
{
if($this->debug) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return($result);
}
function _destroy($session_id)
{
if($this->debug) echo '_destroy:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$sql = "DELETE FROM `".DB_NAME."`.`php_sessions` WHERE `session_id` = '".$session_id."'";
if(($result = mysql_query($sql, $this->dbc)) === false)
{
if($this->debug) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return($result);
}
function _clean($max)
{
if($this->debug) echo '_clean:'.PHP_EOL;
$sql = 'DELETE FROM `'.DB_NAME.'`.`php_sessions` WHERE `last_updated` < DATE_SUB(NOW(), INTERVAL '.$max.' SECOND)';
if(($result = mysql_query($sql, $this->dbc)) === false)
{
if($this->debug) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return($result);
}
}
new TLB_Sessions_in_Database();
END。
48秒開始會話?這是瘋了!會話中有多少數據?你使用任何會話處理庫嗎?將會話保存到不尋常的位置?數據庫(檢查你的索引)?非本地文件系統?它運行什麼類型的服務器?你有沒有在php.ini或.htaccess中的任何會話配置? – Spudley