【问题标题】:PHP session_write_close() keeps sending a set-cookie headerPHP session_write_close() 不断发送一个 set-cookie 标头
【发布时间】:2011-02-26 22:49:49
【问题描述】:

在我的框架中,我多次调用 session_write_close()。

假设会话已与用户代理启动。以下代码...

foreach($i = 0; $i < 3; $i++) {
    session_start();
    session_write_close();
}

...将以下请求头发送到浏览器:

Set-Cookie    PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/
              PHPSESSID=bv4d0n31vj2otb8mjtr59ln322; path=/

不应该有 Set-Cookie 标头,因为正如我规定的,会话 cookie 已经在用户端创建。但是在上面脚本中的第一个之后对 session_write_close() 的每次调用都会导致 PHP 指示浏览器再次设置当前会话。

这并没有破坏我的应用程序或任何东西,但它很烦人。有没有人知道防止 PHP 在每次后续调用 session_write_close 时重新设置 cookie?

编辑

问题似乎在于每次后续调用 session_start() 时,PHP 都会将会话 cookie 重新设置为它自己的 SID 并发送一个 Set-Cookie 响应标头。但是为什么呢??

【问题讨论】:

标签: php session cookies


【解决方案1】:

PHP 不建议这样做,有bunch of bugs submitted for this。因为他们认为这不是一个好习惯 - 这是无法修复的错误。

【讨论】:

  • 感谢您的链接。我同意最后一位评论者的观点,他断言在整个代码中使用多个 session_start/session_write_close 块是完全有效的。如果会话没有被明确关闭,我的网站 - 被 ajaxed 输出 - 将完全锁定。
  • 那么实现自定义会话 cookie 的唯一方法是什么?
  • 看起来像那样...虽然如果没有它一切正常 - 我会保留默认实现...
【解决方案2】:

session_write_close 只是关闭会话并写入数据
而 session_start 发送 cookie
如果您不想发送会话 cookie,则不能调用 session_start

【讨论】:

    【解决方案3】:

    我在 SO 上找到的几乎每个答案都说只是一遍又一遍地执行 session_write_close()session_start()...有些甚至暂时禁用带有 ini_set 的 cookie...这似乎是一个非常糟糕的方法。 PHP 作者提供了一个非常清晰的最佳实践路径,可以使用session_set_save_handler 注入您自己的会话处理方式。

    我在另一篇文章中创建了一个示例,展示了如何将session_start() 替换为Session::start() 并将session_write_close() 替换为Session::save()。该类是为 PHP 5.4+ 实现的非阻塞(用户可以有并发请求)类。事实上,它只是 PHP 示例类的一个调整版本。

    虽然我的示例是 PHP 5.4+,但相同的方法在旧版本的 PHP 中使用回调方法而不是接口实现。

    https://stackoverflow.com/a/27993746/482256

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2020-10-27
      • 2019-03-09
      • 1970-01-01
      • 2021-01-08
      • 2017-03-01
      • 2017-04-06
      相关资源
      最近更新 更多