在我的框架中,我对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响应头。但为什么??
答案 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,并带有回调方法而不是接口实现。