只是想提前写下这么多文字道歉。问题是:我使用持久连接连接数据库,wait_timeout为60秒,我将会话数据存储在MySQL表中。我遇到的问题是会话似乎没有使用自己的行;每个页面刷新都会继续启动新会话,而不是使用旧会话。更重要的是,前面提到的持久连接不断启动新进程,因为他们应该使用自己的进程。由于这两个问题似乎有相同的起源,我决定将它们放在一起。我的PHP代码如下:
mysql_pconnect('localhost','root')或die('无法连接:'。mysql_error());
mysql_set_charset( 'UTF8');
mysql_select_db('azgoth')或die('无法选择DB:'。mysql_error());
session_set_cookie_params(3600,'/','www.azgoth',FALSE,TRUE);
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
function _open(){
return true;}
function _close(){
return true;}
function _read($id){
$id = mysql_real_escape_string($id);
if ($result = mysql_query("SELECT data FROM sess_en WHERE id='$id'")) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];}}
return '';}
function _write($id, $data){
$access = $_SERVER['REQUEST_TIME'];
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
return mysql_query("REPLACE INTO sess_en VALUES('$id', '$access', '$data')");}
function _destroy($id){
$id = mysql_real_escape_string($id);
return mysql_query("DELETE FROM sess_en WHERE id='$id'");}
function _clean($max){
$old = $_SERVER['REQUEST_TIME'] - $max;
$old = mysql_real_escape_string($old);
return mysql_query("DELETE FROM sess_en WHERE access<'$old'");}
session_start();
关于可能导致此问题的任何想法?
编辑:我起初认为它只是在我脑海中,但我现在可以证实这一点:这个奇怪的东西一直随机出现:它通常会,但有时候(很少,实际上)不会...... / p>答案 0 :(得分:1)
每次出现问题的新会话可能是因为您传递给session_set_cookie_params()
的域参数。您已通过www.azgoth
,大概是因为您有多个顶级域名(TLD),并且您希望在所有域名中共享Cookie。这是不允许的。根据您设置的内容,TLD为azgoth
,这不是(当前)可能的,因此cookie将无效并且永远不会被发送回服务器,因此每次都会启动新会话。 / p>
持久数据库问题可能与服务器配置有关。 PHP手册在mysql_pconnect()
页面上说明:
请注意,这些链接仅在您使用PHP的模块版本时才有效。有关详细信息,请参阅Persistent Database Connections部分。
...和...
使用持久连接可能需要对Apache和MySQL配置进行一些调整,以确保不超过MySQL允许的连接数。