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。
也許只是一個剪切/粘貼錯誤,但是你在socket_bind()行缺少一個'');'' – 2012-03-19 15:05:08
'這種行爲在本質上是隨機的 - 你的意思是它並不總是發生嗎?也許是[垃圾收集] //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
@Marc:是的,它是一個錯字 – 2012-03-19 17:23:01