用PHP重新打开会话

Joc*_*ung 18 php apache session session-cookies

如何在不使用标头已发送警告的情况下重新打开PHP中的会话?

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

但是,如果我想稍后设置另一个会话变量,我需要再次使用session_start()重新打开会话.这是有效的,但是因为我已经将代码发送到客户端,所以它会打印"已发送的标题"-warnings.为什么要再次设置cookie?cookie已经设置好了.我唯一需要的是获得再次在服务器上写入会话文件的权限.

好吧,我可以抑制它们.但有没有办法重新打开会话,已经使用session_write_close关闭而不重新发送Cookie标头?Cookie头已由第一个session_start()正确发送.所以第二个只需要给我回访写入存储在Web服务器上的会话文件.

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

Vol*_*erK 19

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
Run Code Online (Sandbox Code Playgroud)

这将阻止PHP php_session_send_cookie()第二次调用.
看它工作.

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

  • 我发现有必要保存会话ID,比如`$ session_id = session_id()`(在`session_write_close()`之前),并稍后使用它像`session_start($ session_id)`.否则我重新开放的会话是空的.此外,我正在使用此技术定期重新打开会话以检查用户是否仍然登录,在脚本中实现服务器发送的事件. (3认同)

Dav*_*dom 6

编辑请参阅@ VolkerK的解决方案,它比这个更好.

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

<?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();
Run Code Online (Sandbox Code Playgroud)

参考:输出控制功能

  • 那行得通。但我认为我宁愿只是抑制警告,而不是使用输出缓冲,这会减慢内容到达客户端的速度。 (2认同)