PHP session_write_close()不断发送set-cookie标头

时间:2011-02-26 22:49:49

标签: php session cookies

在我的框架中,我对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在每次后续调用session_write_close时重新设置cookie?

修改

问题似乎是随着对session_start()的每次后续调用,PHP将会话cookie重新设置为其自己的SID并发送Set-Cookie响应头。但为什么??

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

session_write_close只关闭会话并写入数据
session_start发送cookie时 如果您不想发送会话cookie,则不得致电session_start

答案 2 :(得分:0)

我在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