1

PHP で SOAP 経由で extern 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」のようなメッセージが表示されます。

私が気づいたことがいくつかあります。一度に機能しなかった後は常に、次のリロードで完全に機能し、スクリプトを1分間に数回リロードすると、上記のメッセージでブレーキがかかり、「カウント」パラメーターも99から100に変更されます。マニュアルによると、常に失敗し、スクリプトが上記のエラー メッセージで停止します。これはどのように可能であり、これを修正するにはどうすればよいですか?

マニュアルには、削除するセッションがない場合にこのメッセージが表示されるとのみ記載されています。これは、このセッションが既に削除されているためです。しかし、それはどうしてですか?つまり、常にスクリプトの最後にセッションを閉じるだけで、セッションが前に閉じられることがあるため、セッションが既に閉じられているというエラーが発生しますか?

ご協力いただきありがとうございます。

4

1 に答える 1

0

問題は修正されており、将来同じ問題が発生する可能性があるすべての人にとって、解決策は次のとおりです。

問題は、SOMETIMES によって生成されたセッション ID の ID 文字列に @ が含まれていることです。したがって、@ は PHP の Soap クラスによって自動的にエスケープされません。次を使用して、手動で「エスケープ」する必要があります。

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

これを使用することで、$auth_response->return は完全に文字列として使用され、Soap クラスはエラーなしで動作し続けることができます。そうしないと、Soap クラスは @ までのセッション ID のみを渡し、@ の後のセッション ID の残りの使用を停止します。

これが誰かに役立つことを願っています。

于 2013-02-09T20:35:18.830 に答える