SoapServer::setPersistence

(PHP 5, PHP 7, PHP 8)

SoapServer::setPersistence设置 SoapServer 持久性模式

描述

public SoapServer::setPersistence(int $mode): void

此函数允许在请求之间更改 SoapServer 对象的持久性状态。此函数允许使用 PHP 会话在请求之间保存数据。此方法仅在 SoapServer 使用 SoapServer::setClass() 导出函数后才有效。

注意:

SOAP_PERSISTENCE_SESSION 的持久性仅使给定类的对象持久化,而不使类的静态数据持久化。在这种情况下,请使用 $this->bar 而不是 self::$bar。

注意:

SOAP_PERSISTENCE_SESSION 在请求之间序列化类对象上的数据。为了正确利用资源(例如 PDO),应使用 __wakeup()__sleep() 魔术方法。

参数

mode

一个 SOAP_PERSISTENCE_XXX 常量。

SOAP_PERSISTENCE_REQUEST - SoapServer 数据不会在请求之间持久化。这是调用 setClass 后任何 SoapServer 对象的**默认**行为。

SOAP_PERSISTENCE_SESSION - SoapServer 数据在请求之间持久化。这是通过将 SoapServer 类数据序列化到 $_SESSION['_bogus_session_name'] 来实现的,因此必须在设置此持久性模式之前调用 session_start()

返回值

不返回值。

示例

示例 #1 SoapServer::setPersistence() 示例

<?php
class MyFirstPersistentSoapServer {
private
$resource; // (例如 PDO、mysqli 等)
public $myvar1;
public
$myvar2;

public function
__construct() {
$this->__wakeup(); // 我们正在调用我们的唤醒来处理启动我们的资源
}

public function
__wakeup() {
$this->resource = CodeToStartOurResourceUp();
}

public function
__sleep() {
// 我们确保在此处省略 $resource,因此我们的会话数据保持持久性
// 失败会导致在下一个请求期间数据反序列化失败;因此,我们的 SoapObject 不会在请求之间持久化。
return array('myvar1','myvar2');
}
}

try {
session_start();
$server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
$server->setClass('MyFirstPersistentSoapServer');
// setPersistence 必须在 setClass 之后调用,因为 setClass 的
// 行为在执行该方法时会设置 SESSION_PERSISTENCE_REQUEST。
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
} catch(
SoapFault $e) {
error_log("SOAP ERROR: ". $e->getMessage());
}
?>

参见

添加笔记

用户贡献的笔记 6 个笔记

csnaitsirch at web dot de
14 年前
我想举一个关于如果要以持久性模式使用类,则命令顺序的例子。

<?php
// 1. 类定义或包含
class UserService
{
public function
__construct() { }
}

// 2. 在定义或包含类之后启动会话!
session_start();

// 3. 实例化服务器
$server = new SoapServer(null, array("something"));

// 4. 设置要使用的类
$server->setClass('UserService');

// 5. 设置持久性模式
$server->setPersistence(SOAP_PERSISTENCE_SESSION);

// 6. 处理请求
$server->handle();
?>
boogiebug at gmail dot com
16 年前
setPersistence 仅适用于服务类的单个实例。

要使用服务对象的多个实例,您需要将类实例化为对象,并使用一个未记录的 SoapServer 方法 - setObject() 将服务对象添加到 SoapServer 对象中,并使用 $_SESSION 处理服务对象的持久性。

例如

$ServiceObjects = array()
$ServiceObjects[0] = new ServiceClass1();
$ServiceObjects[1] = new ServiceClass2();
$ServiceObjects[2] = new ServiceClass3();

$_SESSION['ServiceClass1'] = $ServiceObjects[0];
$_SESSION['ServiceClass2'] = $ServiceObjects[1];
$_SESSION['ServiceClass3'] = $ServiceObjects[2];

...

$Servers = array()
for ( $i = 0; $i < count($ServiceObjects); i++)
{
$s = new SoapServer($wsdl);
$s->setObject($ServiceObject[$i]);
$Servers[] = $s;
}

...

$Server[$i]->handle()

...
jan at pinna dot nl
16 年前
我发现同时使用两种模式(SOAP_PERSISTENCE_SESSION 和 SOAP_PERSISTENCE_REQUEST)是不可行的。因为无法同时使用,所以我开始尝试使用不同的设置,正如以下评论中所说,“...也使用 SOAP_PERSISTENCE_REQUEST 在请求之间保存对象”,这让我认为有必要同时使用两种模式。嗯,这可能对其他人有用,但对我来说,这变成了一个令人抓狂的一天 ;) (尝试各种会话内容等等)。
此外,如果持久性不起作用,请检查脚本中是否已调用 session_start(),并尝试不要调用两次或多次:它不会起作用……
jared at ws-db dot com
18 年前
我遇到了一些让会话持久化(SOAP_PERSISTENCE_SESSION)起作用的问题。最终在设置 session.auto_start=0 之后,并在包含 SoapServer 的脚本中只调用 session_start() 之后,它才开始工作。也许这很明显,但我花了一些时间才弄明白。

我只尝试过 session.use_cookies=1,所以如果上面的设置对您不起作用,请确保启用了 cookie,尽管它可能不需要 cookie 就能工作。
cperez1000 at hotmail dot com
19 年前
始终记住将“setPersistence”方法放在“handle”方法之前,否则它将无法工作。这听起来很明显,但它仍然是一个非常常见的错误,因为没有显示任何错误。
doug dot manley at gmail dot com
16 年前
使用“SoapServer::setPersistence( SOAP_PERSISTENCE_SESSION )”时,您显然必须在任何“session_*”命令之前包含在“SoapServer::setClass()”中使用的类。

我通过使用“__autoload()”和大量的“syslog()”发现了这一点;它一直无法包含我用于 soap 服务器的类,但该类只被页面本身引用,即使是这样,也仅仅是为了为 soap 服务器设置类;我的代码永远不会导致它自动加载。问题是我首先包含了我的会话处理代码。

如果在页面定义类定义之前启动了会话,则无法实现持久化。

顺序应该是
1. 包含用于与 soap 服务器一起使用的类。
2. 启动您的会话。
3. 设置您的 soap 服务器。
4. 处理您的 soap 请求。
To Top