繁体   English   中英

我可以使用php Sessions在多个客户端之间共享Session变量吗?

[英]Can I share Session variables between multiple clients with php Sessions?

我想要找到的是,如果我可以为多个客户共享一个Session变量。 就像他们可以使用完全相同的Object。 下面的例子将说明我想做什么。

客户端1:

start_session();
include('somelcass.php');
//some code...
$someobj = new someclass();
$_SESSION['myobject'] = serialize($someobj);
$id = sha1("somephrase");
set_session_var_for_other_users_by_id('myobject', $id);

客户机程序:

start_session();
include('somelcass.php');
$id = sha1("somephrase");
get_sessionvars_from_other_users($id);
$someobj = unserialize($_SESSION['myobject']);
//now use someobj from class someclass

我的另一个问题是:你是否建议使用一些会话扩展,如: sessionPsql

首先回答你的上一个问题:

您链接的Session PgSQL DocsPostgreSQL会话保存处理程序 它是一个会话保存处理程序,您可以配置使用而不是默认的会话保存处理程序。 PHP中的默认会话保存处理程序是将会话存储到磁盘( files )。 如果使用PostgreSQL的保存处理程序会话保存到PostgreSQL数据库中( pgsql )。

如果您希望允许从多个Web服务器(扩展应用程序)或在您的情况下(可能)访问具有SQL查询的所有会话,则可以在数据库中保存会话,尽管通常为定义的会话保存处理程序定义那(可以基于PgSQL会话保存处理函数)。

要回答你的第一个问题:

是的,只要您有与您相关的对象的引用并且您知道如何访问它,就可以这样做。 这可以通过手动访问会话存储或通过自己共享会话以及切换会话来访问其他会话数据来完成。 这取决于您的需求,在您的情况下,可能更容易访问由ID存储的序列化数据在一些与会话无关的额外表中。 如果您不再需要它,您应该考虑如何处理数据,例如在一段时间不活动后将其删除。 最后,您正在以可行的方式编写自己的会话实现。 在版本4之前的PHP没有开箱即用的会话支持,现在它的会话支持非常轻量级,所以如果你需要做更多特定的事情,你通常会编写自己的。

因此,多个客户端可以使用相同的会话(共享会话),这实际上也是一种攻击webapps( 会话劫持攻击 )的方法,但只要“劫持”是在应用程序数据流中,我什么都看不到技术上错了。 在PHP中,这意味着您需要关闭当前会话,打开另一个会话(会话由其名称 ID标识),读取值,关闭其他会话并重新打开当前会话。 它在技术上适用于PHP,但是在执行此操作时编写可靠的代码,因为会话问题很难调试。

这通常也是在多个客户端之间编写自己的对象共享机制的好理由,而不是为此重用PHP的会话功能Doc

多个客户端无法在会话对象中共享数据。 如果要在客户端之间共享数据,通常会使用其他一些服务器端存储方式,例如数据库。

我已经为PHP应用程序编写了一个解决方案,主要解决了两类问题:

  • 如何在PHP Process之间共享数据/变量,托管在相同/不同的服务器上
  • 如何在数据/变量中同步读/写操作

我的项目托管在GitHub ANYEM项目中

第一步:使用命令行启动ANYEM_SERVER

php ANYEM/ANYEM_SERVER/anyem.app.server.impl/ServerImpl.php

现在,在PHP应用程序中,您可以执行以下操作:

<?php
// load server's connection configuration (ANYEM_SERVER IP and Port Number ...) 
$clientConnection    = ClientConnectionImpl::newClient();
// build a key for your variable that will be stored in server
// the key is composed on 3 Parts : [1] => URL, [2] => Variable Namespace, [3] => Variable Name
$identifier          = new ResourceIdentifierImpl("anyem.com", "anyemNameSpace", "a");

$a = 5;
$anyemClient         = new AnyemClientImpl($clientConnection, $identifier);
try {
    // if $a is reserved by another PHP Process, so this process
    // will sleep (1/10) seconds and retry the reservation of the resource
    // here, the max number of reservation attempts is 5, if reservation
    // fails, an Exception will be thrown
    $responseWrapper = $anyemClient->get($a, 5, 100000);
    // here we have reserved the variable $a, and we have the unserialized contents
    $a = $responseWrapper->getResource()->getData();
    // here, we update the contents, send it to ANYEM_SERVER and releasing the lock (we unreserve it)
    $anyemClient->put(++$a);
}
catch (Exception $e) {
    print $e->getMessage() . "\n";
    continue;
}

希望可以帮助别人:)

我认为这个问题的最佳解决方案是使用数据库。 创建一个表并存储在其中。 当您只需要从表中读取数据时。 在会话之间共享数据是快速简便的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM