使用PHP $_COOKIE来管理会话变量


Using PHP $_COOKIE to manage session vars

由于服务器设置,我不得不使用$_COOKIE而不是$_SESSION来管理项目的会话变量。

在我的搜索表单上,我设置了一个初始cookie,但不清楚这是否有帮助或需要?

setcookie('NOSG', 'oHai', time()+7200, '/', 'some.org');

每次加载搜索结果页面时,我都会遍历cookie并返回需要清除的cookie,然后设置新值,如下所示:

if ($board) {
  foreach ($_COOKIE as $k => $v) { 
    if (preg_match('/boa_/', $k)) {
      setcookie($k, '', time()-3600, '/', 'some.org');
    }
  }
  foreach ($people as $p) {
    setcookie('boa_'.$p->ID, $p->whatever, time()+7200, '/', 'some.org');
  }
}

这通常用于在多行<SELECT>输入中进行粘接选择。

这个方法合理吗?我很少使用$_COOKIE做任何事情。

//编辑1:12 PM GMT-06:00所有的评论和回答都集中在修复会话上。我想这是因为有一些原因建议的方法是不健全的?问题是关于使用$_COOKIE来记住表单设置。有人愿意回答为什么我使用的方法是或不适合这个问题吗?

错误

Permission denied. session.save_path is set to /var/lib/php/session PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0

是由于主机/系统管理员的错误造成的。他们应该将/var/lib/php/session的权限设置为777,这样所有用户都可以写它。如果他们使用的东西以用户的身份执行PHP脚本,那么数据仍然是安全的,因为用户拥有会话数据文件,因此没有其他人可以查看或修改它。

或者,您可以动态地将会话保存路径更改为您控制下的目录。

如果你有一个启动会话的公共文件,在session_start()之前添加这个:

session_save_path('/home/yoursite/sessions');
// or
session_save_path($_SERVER['DOCUMENT_ROOT'] . '../sessions');
// or, an alternate method
ini_set('session.save_path', '/home/yoursite/sessions');
session_start();

然后创建该文件夹并设置适当的权限,使其仅由您的用户可读/可写。

从技术上讲,所有会话都是一个文本文件(好的,您也可以将数据保存在数据库中),其中包含由cookie(或地址栏)中保存的值标识的变量。

在PHP中使用setcookie(), serialize()和file_put_contents()将功能写入web树外的文件夹并不是不可能的…尽管您可能还需要一个Cron作业来调度垃圾收集(公平地说,php的本机会话GC似乎并不引人注目)。

你只需要创建一个自定义会话处理对象,并在cookie中为它设置"会话"id,就像你使用正常的会话处理一样-除了使用$_SESSION,你会使用你的session::get()和session::set()方法。

如果你保持API干净,在未来的日期,如果你设法在服务器上启用会话处理,你只需要调整你的会话处理对象,它不会影响你的程序代码的其余部分-这可能是一个好主意抽象然后会话处理无论如何

没有受访者回答我的问题:使用$_COOKIE存储会话数据是一种合理的方法吗?

经验教会了我他们不会教给我的东西。并非所有浏览器都以相同的方式处理cookie。例如,Internet Explorer对每个域的cookie数量有限制:http://support.microsoft.com/kb/941495

所以答案是- $_SESSION优于cookie,因为PHP对所有浏览器都以相同的方式处理它