我可以在多个客户端与php会话之间共享会话变量


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

我想知道的是,如果我可以为多个客户端共享一个会话变量。就像他们可以使用完全相同的对象。下面的例子将说明我想做什么。

client1:

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);

client2:

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

先回答你最后一个问题:

会话PgSQLDocs你链接的是PostgreSQL Session Save Handler。它是一个会话保存处理程序,你可以配置它来代替默认的会话保存处理程序。PHP中默认的会话保存处理程序将会话存储到磁盘( files )。如果你使用PostgreSQL的save处理程序,会话将被保存到PostgreSQL数据库中( pgsql )。

在数据库中保存会话是有意义的,如果你想允许从多个web服务器访问会话存储(扩展应用程序),或者在你的情况下(可能)使用SQL查询访问所有会话,尽管通常会为此定义一个定制的会话保存处理程序(可以基于PgSQL会话保存处理程序函数)。

那么回答你的第一个问题:

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

所以多个客户端可以使用相同的会话(共享一个会话),这实际上也是一种攻击webapps的方式(会话劫持攻击),但只要"劫持"是在你的应用程序数据流中,我看不出任何技术上的错误。在PHP中,这意味着您需要关闭当前会话,打开另一个会话(会话由其名称 ID标识),读取值,关闭另一个会话并重新打开当前会话。从技术上讲,它可以在PHP中工作,但是当你这样做时,要编写可靠的代码,因为会话问题很难调试。

这也是在多个客户端之间编写自己的对象共享机制而不是重用PHP的会话特性Docs的一个很好的理由。

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

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

  • 如何在相同/不同服务器上的PHP进程之间共享数据/变量
  • 如何同步数据/变量的读写操作

My Project is hosting in GitHub ANYEM Project

首先:使用命令行

启动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;
}

希望能帮到别人

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