Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阅读PHP';s会话数据而不加载它_Php_Session - Fatal编程技术网

阅读PHP';s会话数据而不加载它

阅读PHP';s会话数据而不加载它,php,session,Php,Session,我有一个会话id,我想在不将其加载到$会话数组的情况下读取它的数据。请记住,我的问题并没有局限于某个特定的会话处理程序 [更新] 以下是我的设想: 我有两个(或更多)不同的开源项目,我想合并成一个。这些项目使用会话,但它们可以相互覆盖(因为它们都在同一主机和同一域中)。为了防止这种情况发生,我为每个会话设置了不同的会话名称,以便它们有自己的会话。但是我需要编写一些胶水代码,在这些代码中我必须能够访问这两个会话。我可以将一个加载到$\u会话中,但我必须在不加载的情况下阅读其他内容 [更新] 考虑到

我有一个会话id,我想在不将其加载到
$会话
数组的情况下读取它的数据。请记住,我的问题并没有局限于某个特定的会话处理程序

[更新]

以下是我的设想:

我有两个(或更多)不同的开源项目,我想合并成一个。这些项目使用会话,但它们可以相互覆盖(因为它们都在同一主机和同一域中)。为了防止这种情况发生,我为每个会话设置了不同的会话名称,以便它们有自己的会话。但是我需要编写一些胶水代码,在这些代码中我必须能够访问这两个会话。我可以将一个加载到
$\u会话中
,但我必须在不加载的情况下阅读其他内容

[更新]


考虑到目前给出的答案,我想进一步澄清一下。我寻找的解决方案是在同一个请求中启动两次(或更多)会话。每次都使用不同的会话id。这样我可以复制会话并加载另一个会话。话虽如此,它并不是唯一的解决方案,但它最接近我所寻找的(只是一个提示)。

使用SessionHandler类及其方法
read($session\u id)


请参阅此处的更多信息:

我将隐藏到您使用其
$\u会话的项目中。项目应该像以前一样简单地使用
$\u SESSION
,但是您可以管理读取的数据。还可以使用您自己的
SessionHandler
,这样当一个项目的
$\u会话
被销毁时,另一个项目的会话不会被销毁

您应该在开始会话时包含此文件。然后,不要在任何地方使用
session\u start()

如果你使用这个,你将有一个单一的大型会议为所有的项目。您无需更改任何内容(除了删除所有
会话\u start()

我假设您的每个项目都有自己的路径,因此,要区分不同的
$\u会话
s,请使用:

$sessionHandler->registerProject("projectName", __DIR__); // __DIR__ or the path to the project
要访问其他会话,请使用
$\u SESSION->projectName[$variable]


不在任何注册目录中的所有内容都将使用相同的全局会话存储。如果在此全局存储中未设置任何密钥,它将从您的本地存储中获取该密钥,否则将失败并发出通知。

如果您的项目在一台服务器上工作,您可以找到此会话的存储位置,并尝试在不加载PHP实例的情况下手动读取它(PHP只是一个示例)。例如,所有php会话都是通过php.ini中的session.save_path变量中保存的路径定位的。所以您可以读取这个变量(通过一些脚本[bash?]解析它),然后将会话作为公共文件读取。
对于perl来说,它取决于项目中将使用的会话模块。在任何情况下,它最终都将是服务器文件系统中包含文件的某个文件夹。您需要为所有使用不同语言的项目制定自己的解析规则。

我将逐个启动这两个会话,并将$\u会话值存储在本地数组中

i、 e


在PHP手册上的会话函数列表中,没有提供访问这些值的函数。这对我来说没有任何意义。如果您正在运行一个PHP会话,
$\u会话
始终存在。不需要加载任何特定内容。我将更新我的问题,使其有意义。您所说的
是什么意思?它们可以相互覆盖
??别忘了会话是通过sessionID访问的,sessionID是唯一的?由于会话名称不同,不同的项目将有不同的会话ID。这将帮助他们拥有自己的会话存储,这是他们不覆盖彼此会话的关键。现在我需要同时访问不同项目的会话数据。非常感谢您的努力。但是,如果某个项目本身正在使用另一个会话处理程序呢?我正在寻找的是找到一种方法来愚弄PHP,让它在一个请求中多次启动会话,每次都使用不同的会话ID。这样,我就不在乎每个项目如何处理它的会话。@Mehran如果对应用程序没有一些限制,你就不能做你想做的事情;需要一些黑客。大多数项目都没有自己的SessionHandler。我知道我不能拥有我想要的一切(我爸爸认为:),但这并不意味着我不能不想要它。ZendFramework附带了一个不错的SessionHandler,我自己从未使用过它(我自己写的),但由于ZF在PHP开发人员中非常流行,如果我说使用SessionHandler的项目比你想象的要多,这应该是不真实的。@Mehran你希望太多了-P但乍一看,ZF的SessionHandler主要用于使用memcache、数据库保存等。如果被自己的SessionHandler覆盖,则不会改变应用程序的行为。(由于我的SessionHandler在这里使用磁盘存储,这只会使它稍微慢一点)@bwoebi-完全同意你的看法。去探索如何做他想做的事。我只是展示一种正确的方法。但C开发人员编写解决方案需要几天时间。@Mehran—尝试在问题中添加下一个标记:c、php内部构件、php扩展。下面是一个很好的答案:并不是所有的项目都使用文件作为会话存储。而且并不是所有的会话数据都那么容易读取(它们可能是加密的)。我的答案取决于在同一请求中的两个会话ID之间切换会话。正如你两次调用session_start。这正是我想要的,你介意我改进一下吗?@Peter Pivarc,你的回答消除了我48小时的痛苦。
$sessionHandler->registerProject("projectName", __DIR__); // __DIR__ or the path to the project
// Loading the first session.
session_name('first_session_name');
session_start();
// Now we have first session variables available in $_SESSION
$_FIRST_SESSION = $_SESSION;
// End current session.
session_write_close();
// Just to make sure nothing remains in the session.
unset($_SESSION);
// Now set the second session name.
session_name('second_session_name');
// Check and see if the second session name has a session id.
if (isset($_COOKIE['second_session_name']))
    // There's already a session id for this name.
    session_id($_COOKIE['second_session_name']);
else
    // We need to generate a new session id as this is the first time.
    session_id(sha1(mt_rand()));
session_start();
$_SECOND_SESSION = $_SESSION;