2011-03-13 96 views
5

嘿家伙存储会话,我设置了一个负载平衡器EC2集群。我有单独的数据库服务器上运行的MySQL。我有3个Web服务器正在运行,主要是为了获得高可用性,当然它的循环负载均衡似乎是这样,所以每个页面都会有一个不同的服务器,这会让您的会话失去。PHP - 在一个数据库

我想安装PHP将其存储在数据库中。我已经安装了一个表格,并设置了所有功能(打开,关闭等)。我已经设置:

session_set_save_handler('_open', 
         '_close', 
         '_read', 
         '_write', 
         '_destroy', 
         '_clean'); 

但是,当我登录或任何网站上我检查表,什么也没有写。我不确定如果我需要更改php.ini文件中的某些内容。如果是的话,改变的价值是什么?

谢谢!

编辑:功能:

function _open(){  
    global $con; 
    connect(); 
} 

function _close(){ 
    global $con; 
    //mysql_close(); 
} 

function _read($id){  
    global $con;  
    $id = mysql_real_escape_string($id);  
    $sql = "SELECT data FROM sessions WHERE id = '$id'";  
    if ($result = mysql_query($sql, $con)) {   
     if (mysql_num_rows($result)) {    
      $record = mysql_fetch_assoc($result);    
      return $record['data'];   
     }  
    }  
    return ''; 
} 

function _write($id, $data) 
{ 
    global $con; 

    $access = time(); 

    $id = mysql_real_escape_string($id); 
    $access = mysql_real_escape_string($access); 
    $data = mysql_real_escape_string($data); 

    $sql = "REPLACE 
      INTO sessions 
      VALUES ('$id', '$access', '$data')"; 

    return mysql_query($sql, $con); 
} 

function _destroy($id) 
{ 
    global $con; 
    $id = mysql_real_escape_string($id); 
    $sql = "DELETE 
      FROM sessions 
      WHERE id = '$id'"; 
    return mysql_query($sql, $con); 
} 

function _clean($max) 
{ 
    global $con; 

    $old = time() - $max; 
    $old = mysql_real_escape_string($old); 

    $sql = "DELETE 
      FROM sessions 
      WHERE access < '$old'"; 

    return mysql_query($sql, $con); 
} 

session_set_save_handler('_open', 
         '_close', 
         '_read', 
         '_write', 
         '_destroy', 
         '_clean'); 
+0

你可以发布有问题的功能吗?他们是在一个班,他们是独立的职能,等等... – 2011-03-13 18:43:57

+0

刚刚编辑帖子,谢谢:) – 2011-03-13 18:48:32

回答

1

你使用会中断正常会议功能,并在行动中插入代码的功能,然后与其他内部功能矣。

在你没有真正在做任何会话明智的事情(比如'_open'和'_close')的函数中,你需要返回一些东西来继续执行命令,否则它就会死在那里。

例子:

function _open($save_path, $session_name){  
    global $con; 
    connect(); 

    return true; //Do nothing but carry on 
} 

function _close(){ 
    global $con; 
    //mysql_close(); 

    return true; //Do nothing but carry on 
} 
+0

我刚刚编码。仍然不工作:/ – 2011-03-13 19:00:46

+0

我不认为你需要返回'_write'和'_clean'的查询结果对象。尝试将它们替换为返回true。 (并保留'_destroy'的方式) – 2011-03-13 19:02:59

+0

仍然没有任何东西:'( – 2011-03-13 19:05:20

0

真的这不是回答你的问题,但如果你真的需要高可用性,我可以建议存放在MySQL会议不是一个好方法。

一个更好的做法:把你的会话内存缓存中。 Memcache服务器很容易安装。 Memcache客户端很容易安装,php支持在memcache中存储会话而无需编程! Memcache将数据存储在内存中,而不是存储在磁盘中,速度更快。

在这里,您可以看到好的帖子一下:http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/

LUCK !!

+1

-1:这是完全不可扩展的。在高流量的网站上,要么你会开始丢失会议因为你会达到memcached配置的限制,或者随着你的用户基数的增加,你将不得不购买更多的RAM。RAM不便宜。另一方面,硬盘驱动器是... – 2011-03-13 19:11:43

+0

这是EC2我们正在谈论。如果OP在其主要实例中担心内存,那么微小的预算实例足够强大,可以托管*专用的* memcached实例。内存在这个特定的场景中并不是真正的问题。 – Charles 2011-03-13 19:49:21

+0

Memcache不是会话数据库的替代品。把它作为性能层添加是非常好的,但是你仍然应该写入一个更持久的存储,然后读取缓存未命中的商店。 – davidjbullock 2012-05-01 05:05:08

0

你怎么可以不使用cookies?只要脚本检查cookie是否存在,然后从那里读取值。除非安全是一个问题..我建议在饼干届..Writing的数据库会不会好几届便宜的可扩展性,并可能会导致昂贵的查询是无缘无故跑。

0

的会话最好的数据库将是类似的Redis或MonogDB而不是MySQL和Memcached的不是。你可以使用memcached的取决于你如何获取的流量,但Redis的或MongoDB是一个更加可扩展的数据库。另外,由于您使用的是EC2,您可能需要查看Amazon SimpleDB。这是一个关键/价值商店,因此它应该适合会议。

我个人使用MongoDB运行,因为您不仅可以将您的会话存储在那里,还可以从MySQL获取并缓存它,以及在Mongo中存储其他数据......或者只是想一想有关转换您的网站的数据库完全是因为你可能会爱上的MongoDB =)

您还可以查看到HAProxy的下应用程序Cookie设置。这也可以帮助你。

相关问题