2012-02-29 80 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()