首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中重新打开会话

在PHP中重新打开会话
EN

Stack Overflow用户
提问于 2012-09-07 17:19:17
回答 2查看 10.6K关注 0票数 20

如何在PHP中重新打开会话,而不会收到报头已发送的警告?

在设置了我想要设置的所有会话变量之后,我使用session_write_close()关闭会话。我这样做是因为只要会话处于打开状态,可能只有一个来自同一客户端的活动连接。但我喜欢有多个并行的。

但是,如果我想在以后设置另一个会话变量,则需要再次使用session_start()重新打开会话。这是可行的,但是因为我已经向客户端发送了代码,所以它会输出"headers as“-warnings。为什么它要再次尝试设置cookie?cookie已设置。我唯一需要做的就是再次获得在服务器上写入会话文件的权限。

好吧,我可以抑制他们。但是,有没有一种方法可以在不重新发送Cookie-header的情况下重新打开使用session_write_close关闭的会话?Cookie-header已经由第一个session_start()正确发送。因此,第二个只需要让我重新访问存储在web服务器上的会话文件。

代码语言:javascript
复制
<?php
session_start();
// setting all the session vars I like to set
session_write_close(); // <-- // To allow parallel requests by the same user, while this script is still running

// Code that takes some time to execute
// It also prints output, so no more cookie headers after this point

@session_start(); // <-- works, but I like to use it without suppressing warnings
$_SESSION['key'] = 'new value I like to store';
session_write_close();
?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-07 17:37:39

代码语言:javascript
复制
session_start();
...
session_write_close();
...

ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
ini_set('session.use_trans_sid', false);
ini_set('session.cache_limiter', null);
session_start(); // second session_start

这将阻止php再次调用php_session_send_cookie()

See it working

虽然重构脚本似乎仍然是更好的选择,...

对于PHP 7.2+,你基本上需要重新实现会话cookie来避免错误和警告:

代码语言:javascript
复制
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
ini_set('session.use_trans_sid', false);
ini_set('session.cache_limiter', null);

if(array_key_exists('PHPSESSID', $_COOKIE))
    session_id($_COOKIE['PHPSESSID']);
else {
    session_start();
    setcookie('PHPSESSID', session_id());
    session_write_close();
}

session_start();
...
session_write_close();
...

session_start(); // second session_start
票数 25
EN

Stack Overflow用户

发布于 2012-09-07 17:22:43

编辑查看@VolkerK的解决方案,它比这个更好。

只需在脚本执行时缓冲输出,以防止头部被发送,并在最后输出它:

代码语言:javascript
复制
<?php

  session_start();
  // setting all the session vars I like to set
  session_write_close();

  // Start output buffer
  ob_start();

  // Code that takes some time to execute

  // Do session stuff at the end of the script
  session_start();
  $_SESSION['key'] = 'new value I like to store';
  session_write_close();

  // Send output to client
  ob_end_flush();

参考:Output control functions

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12315225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档