Php,在请求之间共享会话,强制session_id


Php, share SESSION between requests, forcing session_id

我的目标是在请求之间共享会话,我的意思是每个请求都可以到达一个数据。首先,我认为简单地通过文件系统共享可能会很好,但我自己发现了这一点:

session_id('0');
session_start();
echo session_id();
var_dump ($_SESSION);
if (!isset($_SESSION['x']))
{
    $_SESSION['x'] = 0;
}
$_SESSION['x']++;
var_dump ($_SESSION);

这样我就可以从浏览器中看到相同的内容。我的问题是,这是一种好的做法吗?

编辑:这是完整的工作版本:

$m = microtime(true);
session_start();
if (session_id() == '0') // this happens when somehow our session id sticks, it should not happen ever, but if so, lets erase it
{
    setcookie (session_name(), '', time() - 3600);
    session_destroy();
    session_write_close();
    echo 'reload'; die;
}
if (!isset($_SESSION['x']))
{
    $_SESSION['x'] = 0;
}
$_SESSION['x']++;
$saveId = session_id();
session_write_close();
// switch to common storage
session_id('0');
session_start();
if (!isset($_SESSION['common']))
{
    $_SESSION['common'] = 0;
}
$_SESSION['common']++;
session_write_close();
// back to our own session
session_id($saveId);
session_start();
echo $_SESSION['x'].'<br>'.(microtime(true) - $m); die;

我不认为它非常耗时。

要知道SESSION是否是放置这些数据的正确位置是很棘手的,但值得记住一些事情。

  • SESSION旨在存储与单个用户访问您网站相关的数据(由于会话 ID 存储在客户端 cookie 中,因此通常区分机器和浏览器的组合(。
  • PHP 会话处理程序的默认行为是:
    • 将数据存储在服务器上的文件中。
    • 阻止对该文件的并发访问。
  • 给定的请求可以有多个会话,但这意味着确保开始和结束每个会话并确保跟踪会话 ID - 我不完全确定如何在不手动将数据写入客户端 cookie 的情况下执行此操作。

总而言之,您可能会发现使用会话的性能会比检查文件是否存在要慢(就 PHP 完成的工作而言,这比使用会话更简单(。

也就是说,如果你正在写入该文件,那么你只会遇到并发问题,你必须以与php会话大致相同的方式解决。

我想说,如果你正在写入数据,那么看看你的数据库。 这就是它们的设计目的。

如果您不想写入主数据库并且有充分的理由,那么可以考虑使用memcache DB或其他辅助存储之类的东西。