1

我在 PHP 中通过 SOAP 使用外部 API。此 API 的正常工作流程是:

  • 认证();
  • 搜索任何你想要的
  • session_close();

按照手册中的说明,我的小 SOAP 客户端执行此操作:

$auth_url  = "http://search.isiknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
$auth_client = @new SoapClient($auth_url,$Options);
$auth_response = $auth_client->authenticate();

$search_url = "http://search.isiknowledge.com/esti/wokmws/ws/WokSearchLite?wsdl";
$search_client = @new SoapClient($search_url,$Options);
$search_client->__setCookie('SID',$auth_response->return);

$search_array = array(
  'queryParameters' => array(
    'databaseID' => 'WOS',
    'userQuery' => 'TS=Medical Informatics',
    'editions' => array(
      array('collection' => 'WOS', 'edition' => 'SSCI'),
      array('collection' => 'WOS', 'edition' => 'SCI')
    ),
    'queryLanguage' => 'en'
  ),
  'retrieveParameters' => array(
    'count' => '99',
    'fields' => array(
      array('name' => 'Date', 'sort' => 'D')
    ),
    'firstRecord' => '1'
  )
);

try{
  $search_response = $search_client->search($search_array);
} catch (Exception $e) {
    echo $e->getMessage();
}

var_dump($search_response);

$auth_client->closeSession();

现在对于奇怪的行为:

当我加载这个小的 PHP 脚本时,它有时可以工作,有时不能。当它正常工作时,它会正确输出找到的数据,而当它没有时,我会得到类似“找不到会话:SID=I2b45baEdoaOLpOE4J8 NodeID=I2”的信息。

我注意到了几件事。总是在它一次不工作之后,下一次重新加载它将完全工作,当我每分钟重新加载脚本几次时,它会因上述消息而制动,还将“计数”参数从 99 更改为 100,这应该是最大值根据手册将始终失败并使用上述错误消息使脚本制动。这怎么可能,我能做些什么来解决这个问题?

手册仅说当没有要删除的会话时会出现此消息,因为该会话已被删除。但怎么可能呢?我的意思是我总是在脚本结束时关闭会话,有时会话在之前关闭,所以会出现错误,说明会话已经关闭?

谢谢你的帮助。

4

1 回答 1

0

问题已解决,对于将来可能遇到相同问题的每个人来说,这里是解决方案:

问题是生成的会话 ID 有时在 ID 字符串中包含一个 @。因此@ 不会被 PHP 中的 Soap 类自动转义。您必须使用以下方法疯狂地“逃脱”它:

$search_client->__setCookie('SID','"' . $auth_response->return . '"');

通过使用它, $auth_response->return 完全用作字符串,并且 Soap 类可以继续工作而不会出现任何错误。如果不这样做,Soap 类只会将会话 ID 传递到 @,停止使用 @ 之后的其余会话 ID。

希望这可以帮助某人。

于 2013-02-09T20:35:18.830 回答