【问题标题】:PHP cookies in a session handler会话处理程序中的 PHP cookie
【发布时间】:2010-04-22 23:09:23
【问题描述】:

我在尝试调试我的自定义 PHP 会话处理程序时遇到了一个非常有趣的问题。由于某种我不知道的原因,我可以通过会话处理程序一直设置 cookie,直到写入函数的最开始。

据我所知,会话处理程序调用按此顺序进行。

open -> read -> write -> close

open 函数设置一个 cookie 就好了。

function open($save_path,$session_name)  
{  
  require_once('database.php');  
  require_once('websiteinfo.php');
  mysql_connect($sqllocation,$sql_session_user,$sql_session_pass);
  @mysql_select_db($sql_default_db);
  date_default_timezone_set('America/Los_Angeles');  
  setcookie("test","test");
  return TRUE;  
}

read 函数可以设置一个 cookie,直到它返回一个值。

function read($session_id)
{
  $time = time();
  $query = "SELECT * FROM 'sessions' WHERE 'expires' > '$time'";
  $query_result = mysql_query($query);
  $data = '';

  /* fetch the array and start sifting through it */
  while($session_array = mysql_fetch_array($query_result))
  {
    /* strip the slashes from the session array */
    $session_array = $this->strip($session_array);

    /* authenticate the user and if so return the session data */
    if($this->auth_check($session_array,$session_id))
    {
      $data = $session_array['data'];
    }
  }

  setcookie("testcookie1","value1",time()+1000,'/');

  return $data;
}

write 函数的第一行是设置另一个 cookie,它不能,因为 headers 已经发送。

【问题讨论】:

    标签: php cookies session


    【解决方案1】:

    来自session_set_save_handler()的手册:

    注意:“写”处理程序不是 执行到输出流之后 已经关闭。因此,调试的输出 “写”处理程序中的语句将 永远不会在浏览器中看到。如果 调试输出是必要的,它是 建议调试输出为 而是写入文件。

    基本上,在 PHP 几乎完全完成其执行周期之前,不会发生对会话数据的更改(调用已注册的会话写入函数)。此时,你的所有输出都已经发送完毕,无法修改头部信息,所以setcookie()将不起作用。

    您可以使用session_write_close() 让它更早地写入数据。

    【讨论】:

    • 我相信这是我问题的答案,先生。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2015-08-20
    • 2013-03-22
    相关资源
    最近更新 更多