2012-03-19 32 views
1

我在php腳本中使用以下代碼段來處理通過http傳入的數據並將其轉發到另一個模塊並等待響應。然後關閉插座。PHP Udp socket關閉不釋放系統資源

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_bind($sock,$host,$port) or die("<?xml version=\"1.0\"?>"); 
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { 
echo socket_strerror(socket_last_error($sock)); 
exit; 
} 
$arrOpt = array('l_onoff' => 1, 'l_linger' => 1); 
socket_set_block($sock); 
socket_set_option($sock, SOL_SOCKET, SO_LINGER, $arrOpt); 
$address = gethostbyname($host); 

$msg = $url; 
$len = strlen($msg); 
socket_sendto($sock, $msg, $len, 0, $remotehost, $remoteport) ; 
socket_recvfrom($sock, $buff, 1000, 0, $host, $newport); 
socket_close($sock); 

面臨的問題是響應正確接收,並且socket_close錯誤也返回成功(輸出socket_last_error)。但之後,如果我做了netstat,我看到端口正在使用,並且進程(/ proc/pid/status的輸出)處於睡眠狀態。 此行爲在本質上是隨機的,我在Amazon EC2雲上使用PHP版本5.3.8。

+0

也許只是一個剪切/粘貼錯誤,但是你在socket_bind()行缺少一個'');'' – 2012-03-19 15:05:08

+0

'這種行爲在本質上是隨機的 - 你的意思是它並不總是發生嗎?也許是[垃圾收集] //php.net/manual/en/features.gc.php),請嘗試以下方法:1)嘗試顯式設置'$ sock = NULL;'on最後一行2)嘗試在最後一行調用['gc_collect_cycles()'](http://php.net/manual/en/function.gc-collect-cycles.php)。 – DaveRandom 2012-03-19 15:15:02

+0

@Marc:是的,它是一個錯字 – 2012-03-19 17:23:01

回答

0

其對TIME_WAIT ...釋放插座

在Linux下運行

# /proc/sys/net/ipv4/tcp_fin_timeout找出....(默認爲60秒)

more about