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

时间:2014-12-22 13:05:31

标签: php session

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

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;

我不太浪费时间。

1 个答案:

答案 0 :(得分:1)

了解SESSION是否是放置此数据的正确位置很棘手,但值得记住一些事情。

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

总而言之,您可能会发现使用会话的性能会比检查文件的存在还要慢(根据PHP的工作,这比使用会话更简单)。 / p>

也就是说,如果你到那个文件,那么你只会遇到并发问题,你必须以与以下相同的方式解决这个问题。无论如何,php会话都会。

我要说,如果您要写数据,请查看您的数据库。这是他们为之设计的。

如果您不想写入主数据库且有充分理由,那么可以考虑使用memcache DB或其他二级存储。