2011-09-30 70 views
0

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

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

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

每次搜索结果页面加载我遍历饼干和回复日期的那些我需要清除,然后设置新值,就像这样:

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来记住表单设置。有人会关心为什么我使用的方法是或不适合这个问题吗?

+1

什么样的服务器设置? –

+2

你真的应该改变你的服务器设置以允许会话。我从来没有见过一个没有会话的网站...... $ _COOKIE数据是用户自由阅读和编辑的。 – ceejayoz

+0

权限被拒绝。 session.save_path设置为/ var/lib/php/session PHP警告:未知:无法写入会话数据(文件)。请确认第0行 – jerrygarciuh

回答

0

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

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

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

2

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

使用诸如setcookie(),serialize()和file_put_contents()写入web树之外的文件夹之类的东西,在PHP中重新创建功能是不可能的......尽管您可能还需要Cron作业计划垃圾收集(公平地说,PHP本地会话GC似乎并不太好)。

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

如果您保持API清洁,那么在未来的日期,如果您设法在服务器上启用会话处理,则只需调整会话处理对象,而不会影响程序的其余部分代码 - 无论如何,抽象掉会话处理可能是一个好主意。

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

然后就创建了一个文件夹,并设置适当的权限,以便它读取你的用户/写只要。

+0

虽然我的答案是可行的......这是一个更明智的解决方案,所以我已经投了票。尽管如此,我仍然会将会话管理抽象为一个对象;) – CD001