PHP:sessions和mysql_pconnect()都会不断启动新的会话/进程

PHP:sessions和mysql_pconnect()都会不断启动新的会话/进程,php,mysql,session,new-operator,Php,Mysql,Session,New Operator,我只是想为写这么多的文字提前道歉。问题是:我使用一个持久连接连接到数据库,等待超时为60秒,我将会话数据存储在MySQL表中。我的问题是,会话似乎没有使用自己的行;每次页面刷新都会启动一个新会话,而不是使用旧会话。更重要的是,前面提到的持久性连接会不断启动新的进程,而不会像它们应该使用的那样使用它们自己的进程。由于这两个问题似乎有相同的起源,我决定把它们放在一起。我的PHP代码如下所示: () mysql_pconnect('localhost','root')或die('cannotconne

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

()

mysql_pconnect('localhost','root')或die('cannotconnect:'。mysql_error()); mysql_集_字符集('utf8')
mysql_select_db('azgoth')或die('not choose db:'。mysql_error())

session\u set\u cookie\u参数(3600,“/”,“www.azgoth”,FALSE,TRUE);
会话设置保存处理程序(“打开”、“关闭”、“读取”、“写入”、“销毁”、“清除”);
函数_open(){
返回true;}
函数_close(){
返回true;}
函数_read($id){
$id=mysql\u real\u escape\u字符串($id);
if($result=mysql_query(“从sess_en中选择数据,其中id='$id')){
if(mysql_num_行($result)){
$record=mysql\u fetch\u assoc($result);
返回$record['data'];}
返回“”;}
函数_write($id,$data){
$access=$\u服务器['REQUEST\u TIME'];
$id=mysql\u real\u escape\u字符串($id);
$access=mysql\u real\u escape\u string($access);
$data=mysql\u real\u escape\u字符串($data);
返回mysql_query(“替换为sess_en值('$id','$access','$data')”);}
函数_销毁($id){
$id=mysql\u real\u escape\u字符串($id);
返回mysql_查询(“从sess_en删除,其中id='$id');}
功能清洁($max){
$old=$\u服务器['REQUEST\u TIME']-$max;
$old=mysql\u real\u escape\u字符串($old);

返回mysql_query(“从sess_en删除,其中access每次出现问题时都会启动新会话,这可能是因为您传递给了
会话设置\u cookie_params()
。您传递了
www.azgoth
,可能是因为您有多个顶级域(TLD)您希望cookie在所有人之间共享。这是不允许的。根据您设置的,TLD是
azgoth
,这(当前)是不可能的,因此cookie将无效,并且永远不会发送回服务器,因此每次都会启动一个新会话

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

请注意,只有在使用模块版本的PHP时,这些链接才有效。有关更多信息,请参阅本节

……还有

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


每次启动新会话时出现问题可能是因为您已传递给
会话设置\u cookie\u params()
。您已传递
www.azgoth
,可能是因为您有多个顶级域(TLD)您希望cookie在所有人之间共享。这是不允许的。根据您设置的,TLD是
azgoth
,这(当前)是不可能的,因此cookie将无效,并且永远不会发送回服务器,因此每次都会启动一个新会话

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

请注意,只有在使用模块版本的PHP时,这些链接才有效。有关更多信息,请参阅本节

……还有

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


仅供参考,要将数据放在代码块中,只需在每个代码行前面加上四个空格,或用
将其换行,或突出显示代码,然后单击代码按钮
{}
.FYI,要将数据放在代码块中,只需在每个代码行前面加上四个空格,或者用
将其包装起来。或者突出显示代码,然后单击代码按钮
{}
。我目前有三种语言版本的网站:lt.azgoth(立陶宛语)、ru.azgoth(俄语)和www.azgoth(英语).在上面的例子中,我只是希望会话cookie仅在英语网站上可用,但是,由于我对基于会话的php的知识有限,我一定把它搞砸了。所以你说的是,不可能为每个版本的网站制作单独的会话cookie,我只能依靠数据库表名,对吗?这是错误的It’做你想做的事情并非不可能——你只需要在cookie域中包含顶级域(.com、.net、.org等)。因此,你可以将英语域设置为
www.azgoth.com
,将俄语域设置为
ru.azgoth.com
,但你必须包含
.com
。你可以设置所有“语言”的全局cookie(即子域)通过将域设置为
.azgoth.com
-即省略子域,但包含一个前导的
。我相信我现在看到了问题。因为我现在将脚本保留在本地主机上,所以我只有没有.com的地址(例如,我通过
http://azgoth
)。这一定是破坏PHP标准结构要求的原因。谢谢你的回答,Dave,你真的帮了大忙!如果你的用户已经在该站点上设置了cookie,不管怎样,忽略域参数可能会更容易-这肯定会增加可移植性。你可以跳过这个参数使用空字符串
'
,并且它应该按照您希望的方式工作(我认为-如果我理解您所做的是正确的.)。。
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();