PHP Conference Nagoya 2025

SoapServer->setPersistence()

(PHP 5, PHP 7, PHP 8)

SoapServer->setPersistence()Versetzt einen SoapServer in den Persistenz-Modus

Beschreibung

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

Diese Funktion erlaubt das Ändern des Persistenzzustands eines SoapServer Objekts zwischen Anfragen. Diese Funktion erlaubt das Speichern von Daten zwischen Anfragen durch Verwendung von PHP Sessions. Diese Methode hat nur Auswirkungen auf den SoapServer, nachdem er Funktionen unter Verwendung von SoapServer::setClass() exportiert hat.

Hinweis:

Die Option SOAP_PERSISTENCE_SESSION macht nur Objekte der angegebenen Klasse persistent, nicht aber ihre statischen Eigenschaften. Daher sollten sie $this->bar anstatt von self::$bar nutzen.

Hinweis:

SOAP_PERSISTENCE_SESSION serialisiert Daten des Klassenobjekts zwischen Anfragen. Damit Ressourcen (z. B. PDO) ordnungsgemäß verwendet werden können, sollten die magischen Methoden __wakeup() und __sleep() verwendet werden.

Parameter-Liste

mode

Eine der SOAP_PERSISTENCE_*-Konstanten.

SOAP_PERSISTENCE_REQUEST - SoapServer Daten bleiben zwischen Anfragen nicht erhalten. Das ist das standardmäßige Verhalten von jedem SoapServer Objekt nachdem setClass aufgerufen wurde.

SOAP_PERSISTENCE_SESSION - SoapServer Daten bleiben zwischen Anfragen erhalten. Dies wird durch Serialisierung der SoapServer Klassendaten in $_SESSION['_bogus_session_name'] erreicht, weshalb session_start() aufgerufen werden muss, bevor dieser Persistenzmodus eingestellt wird.

Rückgabewerte

Es wird kein Wert zurückgegeben.

Beispiele

Beispiel #1 SoapServer::setPersistence()-Beispiel

<?php
class MyFirstPersistentSoapServer {
private
$resource; // (wie z. B. PDO, mysqli usw.)
public $myvar1;
public
$myvar2;

public function
__construct() {
$this->__wakeup(); // Wir rufen unser wakeup auf, damit die Ressource verwendet werden kann
}

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

public function
__sleep() {
// Wir stellen sicher, dass $resource hier ausgelassen wird, damit
// unsere Sessiondaten persistent bleiben. Versäumen wir dies, wird das
// Deserialisieren der Daten bei der nächsten Anfrage fehlschlagen;
// folglich wäre unser SoapObject nicht anfrageübergreifend persistent.
return array('myvar1','myvar2');
}
}

try {
session_start();
$server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
$server->setClass('MyFirstPersistentSoapServer');
// setPersistence MUSS nach setClass aufgerufen werden, weil setClass
// SESSION_PERSISTENCE_REQUEST setzt sobald die Methode ausgeführt wird.
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
} catch(
SoapFault $e) {
error_log("SOAP FEHLER: ". $e->getMessage());
}
?>

Siehe auch

add a note

User Contributed Notes 6 notes

up
3
csnaitsirch at web dot de
14 years ago
I want to give one example for the order of commands if you want to use a class in persistence mode.

<?php
// 1. class definition or include
class UserService
{
public function
__construct() { }
}

// 2. start the session after defining or including the class!!
session_start();

// 3. instanciate the server
$server = new SoapServer(null, array("something"));

// 4. set the class to use
$server->setClass('UserService');

// 5. set persistance mode
$server->setPersistence(SOAP_PERSISTENCE_SESSION);

// 6. handle the request
$server->handle();
?>
up
2
boogiebug at gmail dot com
16 years ago
setPersistence works only for a single instance of service class.

To use multiple instance of services objects, you need to instantiate the classes into objects and use an undocumented SoapServer's method - setObject() to add the service object into the SoapServer object, and handle the service object persistence with $_SESSION instead.

For example:

$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()

...
up
2
jan at pinna dot nl
16 years ago
I found that using both modes (SOAP_PERSISTENCE_SESSION and SOAP_PERSISTENCE_REQUEST) cannot be used simultaniously. Because it didn't work at once, I started experimenting by using different settings and as stated below in the comments, "...also use SOAP_PERSISTENCE_REQUEST to save objects between requests" led me to think it was nessecary to use both modes. Well, it might for others, be but for me it turned out a day of freaking out ;) (trying all kinds of session stuff, etc etc).
Also, if persistence doesn't work, please check if session_start() is called somewhere in the script and try not to call it twice or whatsoever: it won't work...
up
2
jared at ws-db dot com
19 years ago
I had some issues getting session persistence (SOAP_PERSISTENCE_SESSION) to work. I finally got it working after setting session.auto_start=0, and then only calling session_start() in the script containing the SoapServer. Maybe this is obvious, but took me a bit to figure it out.

I only tried it with session.use_cookies=1, so if the settings above don't work for you, make sure cookies are enabled, though it may work without the need for cookies.
up
2
cperez1000 at hotmail dot com
19 years ago
Always remember to place the "setPersistence" method before the handle method, otherwise it won't work. It sounds obvious, but it's still a very common mistake, since no errors are shown.
up
1
doug dot manley at gmail dot com
16 years ago
When using "SoapServer::setPersistence( SOAP_PERSISTENCE_SESSION )", you apparently MUST include the class that was used in "SoapServer::setClass()" BEFORE any "session_*" commands.

I found this out using "__autoload()" and a whole lot of "syslog()"; it kept failing to include the class that I was using for my soap server, but that class is ONLY ever referenced by the page itself, and even then only for the purposes of setting the class for the soap server; none of my code would ever cause it to autoload. The problem was that I was including my session-handling code first.

If the session gets started BEFORE the page defines the class definition, then persistence CANNOT happen.

The order should be:
1. Include the class for use with the soap server.
2. Start up your session.
3. Set up your soap server.
4. Handle your soap request.
To Top