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

时间:2011-09-30 17:18:10

标签: php cookies setcookie

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

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

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

每次加载搜索结果页面时,我都会迭代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格林威治标准时间-06:00 所有评论和答案都集中在修复会话上。我认为这是因为有一些原因建议的方法不健全?问题是关于使用$ _COOKIE来记住表单设置。有人会关心为什么我使用的方法是否适合问题?

3 个答案:

答案 0 :(得分:4)

错误

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();

然后只创建该文件夹并相应地设置权限,以便您的用户只能读/写。

答案 1 :(得分:2)

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

使用setcookie(),serialize()和file_put_contents()写入Web树外部文件夹等内容在PHP中重新创建功能是不可能的......尽管您可能还需要一个Cron作业来安排垃圾收集(公平地说,PHP原生会话GC看起来并不壮观)。

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

如果您保持API干净,那么在将来某个日期,如果您设法在服务器上启用会话处理,您只需要调整会话处理对象,它不会影响您的其余程序代码 - 无论如何抽象出会话处理可能是个好主意。

答案 2 :(得分:0)

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

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

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