PHP - 奇怪的会话错误

时间:2012-11-23 14:01:02

标签: php session

我在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'。

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

“手册”仅表示当没有要删除的会话时会出现此消息,导致此会话已被删除。但那怎么可能呢?我的意思是我只是在脚本结束时关闭会话,有时会话会被​​关闭,所以会发生错误,说明会话已经关闭了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题已得到修复,对于今后可能会遇到同样问题的每个人来说都是解决方案:

问题是会话ID生成的SOMETIMES包含ID字符串中的@。因此,@不会被PHP中的Soap类自动转义。你必须通过使用:

来“逃避”它
$search_client->__setCookie('SID','"' . $auth_response->return . '"');

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

希望这有助于某人。