使用php soap客户端的奇怪的超时行为

时间:2012-02-29 17:23:29

标签: php soap curl

我正在尝试创建一个类似于代理的页面,将AJAX请求转发给SOAP服务器。 浏览器每10秒向同一页面发送2个请求(即具有不同查询字符串的server.php)。 服务器根据查询字符串对soap服务器进行soap调用。 一切正常。

然后我在肥皂服务器中进行了一次睡眠(40秒)以模拟慢速响应,并且我还在呼叫者上设置超时以在几秒钟后中止呼叫。

server.php: Pseudo code:

$timeout = 10;
ini_set("default_socket_timeout", $timeout);

$id = $_GET['id'];

$wsdl= 'http://soapserver/wsdl'
$client = new SoapClient($wsdl,array('connection_timeout'=> $timeout));
print($client->getQuote($id));

如果浏览器向http://myserver/server.php?id=IBM发送ajax请求 我设置的超时后请求停止。 如果我在第一次停止之前尝试进行第二次呼叫,则第二次呼叫不会违反超时。

i.e.

Request:

GET http://myserver/server.php?id=IBM 
and after 1 second 
GET http://myserver/server.php?id=AAP

Response:

after 10 seconds:
No data
after 20 seconds:
No data

我也试过不使用PHP SOAP而是使用curl,但我得到了相同的结果。

我还尝试在浏览器上打开3个标签并致电:

http://myserver/server.php?id=IBM
http://myserver/server.php?id=AAP
http://myserver/server.php?id=MSX

第一个在10秒后停止,第二个在20秒后停止,第三个在30秒后停止。

这是正常行为还是我错过了什么? 提前致谢

1 个答案:

答案 0 :(得分:0)

你可能正在开始会话,并且session_start()阻止对它的第二次调用,直到另一个请求'释放'了会话(换句话说:已经完成并且不再向会话写入任何数据)。对于耗时的请求,如果您不需要,请不要启动会话,如果您需要,请获取所需的所有数据,然后在执行耗时的操作之前调用session_write_close()。如果您之后需要写入会话,请再次致电session_start()