PHP Conference Japan 2024

SoapServer::setPersistence

(PHP 5、PHP 7、PHP 8)

SoapServer::setPersistence設定 SoapServer 持續性模式

說明

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

這個函式允許在請求之間變更 SoapServer 物件的持續性狀態。這個函式允許利用 PHP 會話在請求之間儲存資料。這個方法僅在 SoapServer 使用 SoapServer::setClass() 匯出函式後才會對 SoapServer 產生影響。

注意:

SOAP_PERSISTENCE_SESSION 的持續性僅讓給定類別的物件保持持續,而不是類別靜態資料。在這種情況下,請使用 $this->bar 而不是 self::$bar。

注意:

SOAP_PERSISTENCE_SESSION 會在請求之間序列化類別物件上的資料。為了正確利用資源(例如 PDO),應該使用 __wakeup()__sleep() 魔術方法。

參數

mode

SOAP_PERSISTENCE_* 常數之一。

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(); // 我們呼叫 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 錯誤: ". $e->getMessage());
}
?>

參見

新增註解

使用者貢獻的註解 6 則註解

3
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();
?>
2
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()

...
2
jan at pinna dot nl
16 年前
我發現無法同時使用兩種模式(SOAP_PERSISTENCE_SESSION 和 SOAP_PERSISTENCE_REQUEST)。因為它沒有立即運作,我開始嘗試使用不同的設定,並且如下面註解中所述,「...也使用 SOAP_PERSISTENCE_REQUEST 來儲存請求之間的物件」讓我認為有必要使用兩種模式。好吧,這可能對其他人來說是這樣,但對我來說卻是一天的大驚小怪 ;)(嘗試各種會話的東西等等)。
此外,如果持續性無法運作,請檢查是否在腳本中的某個位置呼叫了 session_start(),並盡量不要呼叫兩次或其他方式:它不會運作...
2
jared at ws-db dot com
19 年前
我在讓會話持續性 (SOAP_PERSISTENCE_SESSION) 運作時遇到了一些問題。在設定 session.auto_start=0,然後僅在包含 SoapServer 的腳本中呼叫 session_start() 後,我最終讓它運作了。也許這很明顯,但我花了一些時間才弄清楚。

我只有在 session.use_cookies=1 的情況下測試過,所以如果上述設定對你無效,請確保 cookie 已啟用,儘管它可能在不需要 cookie 的情況下也能運作。
2
cperez1000 at hotmail dot com
19 年前
務必記得將 "setPersistence" 方法放在 handle 方法之前,否則它將無法運作。這聽起來很明顯,但它仍然是一個非常常見的錯誤,因為不會顯示任何錯誤訊息。
1
doug dot manley at gmail dot com
16 年前
當使用 "SoapServer::setPersistence( SOAP_PERSISTENCE_SESSION )" 時,你顯然必須在任何 "session_*" 指令之前包含在 "SoapServer::setClass()" 中使用的類別。

我透過使用 "__autoload()" 和大量的 "syslog()" 發現了這一點;它一直無法包含我用於我的 SOAP 伺服器的類別,但該類別只會被頁面本身引用,而且即使如此,也只是為了設定 SOAP 伺服器的類別;我的程式碼都不會導致它自動載入。問題是我首先包含了我的 session 處理程式碼。

如果 session 在頁面定義類別定義之前啟動,則持久性將無法發生。

順序應該是
1. 包含用於 SOAP 伺服器的類別。
2. 啟動您的 session。
3. 設定您的 SOAP 伺服器。
4. 處理您的 SOAP 請求。
To Top