我正在尝试使用 SOAP 扩展在 PHP 中实现有状态的 Web 服务。(是的,我知道 Web 服务应该是无状态的;我真正关心的只是某种形式的会话 ID,因此我不需要在每次调用服务时都进行身份验证)。PHP.net 的 API 文档在这方面有些欠缺,并且没有太多其他内容。
我找到了一个讨论它的页面(http://bytes.com/forum/thread160816.html)并将代码实现为测试。我构建了一个小型 .NET 应用程序,它使用 Web 服务并调用每个函数并显示结果。根据我的阅读,只要使用 setClass() 函数将功能封装在一个类中,并且 setPersistence() 函数通过 SOAP_PERSISTENCE_SESSION 传递,PHP SOAP 扩展就会在调用之间保持类变量。
这是我的代码:
<?php
class User
{
var $name = "Initial value";
function setName($name)
{
$this->name = $name;
// Tried this too.
// $this->name = "Set to string constant" ;
}
function getName()
{
// This always returns "Initial value"
return $this->name;
}
}
// Tried placing session_start() in several places
// before $server->handle()...
// One guy says this doesn't need to be called.
// I assume it depends on if session autostart is on.
session_start();
$server = new SoapServer(null, array('uri' => 'http://localhost/'));
$server->setClass('User');
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
?>
我遇到的问题是 $name 在调用之间没有持久化——我总是得到初始化的值,而不是我分配给 setName() 的值。正如我所说,我试图在对数据库进行身份验证后保留会话 ID——如果有人有更好的方法来做到这一点,我愿意接受建议;但是,我仍然想解决一般情况。有人有想法么?