如何将在肥皂服务器中创建的SESSION转移到肥皂客户端代码?

时间:2019-08-12 10:29:26

标签: php session soap soap-client soapserver

我已经用PHP创建了一个非wsdl soap服务器,以运行我拥有的所有服务器中的功能。从我的个人资料可以看出,这方面存在很多问题,但我希望可以解决。我无法在服务器和客户端之间传输SESSION数据。

已经使用

.menu

并手动设置session_id

$server->setPersistence(SOAP_PERSISTENCE_SESSION);

但没有运气将SESSION数据传输到客户端。

是否可以将在soap-server.php上创建的SESSION数据传输到soap-client.php?

1 个答案:

答案 0 :(得分:0)

给这个肥皂服务器

class MyClass
{
  public function __construct(){
    session_start();
  }
  public function login( $user )
  {
    $_SESSION['user'] = $user;
    return true;
  }
  public function getUserName()
  {
    return isset( $_SESSION['user'] ) ? $_SESSION['user'] : false;
  }
}
$server = new SoapServer( null, array( 'uri' => 'http://localhost/scratch/soap.server.php' ) );
$server->setClass('MyClass');
$server->handle();

还有这个肥皂客户

$url = 'http://localhost/scratch/soap.server.php';
$config = array( 'location' => $url, 'uri' => $url );

// Call the "login" function to set the user name
$firstClient = new SoapClient(null, $config);
$firstClient->login( array( 'MyUserName' ) ); // ONLY CALL LOGIN ONCE
var_dump( $firstClient->getUserName() ); // TRUE

// Track the cookies
$cookies = $firstClient->__getCookies();

// Second Client fails because we didn't set cookies
$secondClient = new SoapClient(null, $config);
var_dump( $secondClient->getUserName() ); // FALSE

// Works because we've set cookies from the first request
$thirdClient = new SoapClient(null, $config );
$thirdClient->__setCookie( 'PHPSESSID', $cookies['PHPSESSID'][0] );
var_dump( $thirdClient->getUserName() ); // TRUE
  1. 您可以看到我正在创建三个单独的soap客户端,第一个执行登录,您可以看到后续的getUserName()可以正常工作,因为我们使用的是相同的连接上下文,并且内部重新使用了初始Cookie 。
  2. 第二个客户端是独立的,不了解现有会话,并且按预期失败。
  3. 第三个客户端从第一个客户端注入了cookie,并且能够通过会话跟踪用户名,并且getUserName()能够在没有login()功能的情况下恢复。

理想情况下,出于此测试的目的,您将以编程方式自动执行cookie的注入,而不是我的“硬编码”

因此,从这里开始,您必须自己管理肥皂客户端的cookie。


如果您需要会话数据本身,没有什么可以阻止您创建导出功能...例如,在此示例中为getSessionData

class MyServerClass
{
  public function __construct(){
    session_start();
  }
  public function login( $user )
  {
    $_SESSION['user'] = $user;
    $_SESSION['SomeObject'] = new stdClass();
    $_SESSION['SomeObject']->foo = 'bar';
    return true;
  }
  public function getSessionData()
  {
    return $_SESSION;
  }
}