2012-02-29 104 views
0

我试图做一个代理类页转发一个AJAX请求SOAP服务器。 浏览器每10秒发送2个请求到同一页面(即server.php和不同的查询字符串)。 服务器根据查询字符串对soap服务器进行soap调用。 所有工作正常。奇怪的超时行为使用PHP SOAP客户端

然后我把睡眠(40秒),在SOAP服务器来模拟一个缓慢的反应,我也把超时主叫方中止在几秒钟后电话。

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)); 

如果浏览器发送一个Ajax请求http://myserver/server.php?id=IBM 请求我设置的超时后停止。 如果我在第一站之前尝试拨打第二个电话,第二个电话不会超时。

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个标签,并调用:10秒,20秒后第二和30秒后的第三后

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

第一个停止。

这是一种正常的行为或我错过了什么? 在此先感谢

回答

0

你可能会开始会议,并session_start()块给它的第二个电话,直到其他请求“释放”会话(换句话说:已完成,不会写入任何数据到会话了) 。对于耗时的请求,如果您不需要启动会话,请不要启动会话,如果您需要启动会话,请获取所需的所有数据,然后在执行耗时的操作之前调用session_write_close()。如果您之后需要写入会话,请再次拨打session_start()