PHP:会话和mysql_pconnect()都会继续启动新的会话/进程

时间:2011-10-15 20:36:42

标签: php mysql session new-operator

只是想提前写下这么多文字道歉。问题是:我使用持久连接连接数据库,wait_timeout为60秒,我将会话数据存储在MySQL表中。我遇到的问题是会话似乎没有使用自己的行;每个页面刷新都会继续启动新会话,而不是使用旧会话。更重要的是,前面提到的持久连接不断启动新进程,因为他们应该使用自己的进程。由于这两个问题似乎有相同的起源,我决定将它们放在一起。我的PHP代码如下:

View it on Pastebin

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>

1 个答案:

答案 0 :(得分:1)

每次出现问题的新会话可能是因为您传递给session_set_cookie_params()的域参数。您已通过www.azgoth,大概是因为您有多个顶级域名(TLD),并且您希望在所有域名中共享Cookie。这是不允许的。根据您设置的内容,TLD为azgoth,这不是(当前)可能的,因此cookie将无效并且永远不会被发送回服务器,因此每次都会启动新会话。 / p>

持久数据库问题可能与服务器配置有关。 PHP手册在mysql_pconnect()页面上说明:

  

请注意,这些链接仅在您使用PHP的模块版本时才有效。有关详细信息,请参阅Persistent Database Connections部分。

...和...

  

使用持久连接可能需要对Apache和MySQL配置进行一些调整,以确保不超过MySQL允许的连接数。