PHP Udp套接字关闭不释放系统资源

PHP Udp套接字关闭不释放系统资源,php,udp,netstat,Php,Udp,Netstat,我在php脚本中使用以下代码通过http处理传入数据,并将其转发到另一个模块,然后等待响应。然后关闭插座 $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 soc

我在php脚本中使用以下代码通过http处理传入数据,并将其转发到另一个模块,然后等待响应。然后关闭插座

$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);
$sock=socket\u创建(AF\u INET、sock\u DGRAM、SOL\u UDP);
套接字绑定($sock,$host,$port)或死(“”);
如果(!socket\u set\u选项($sock,SOL\u socket,SO\u REUSEADDR,1)){
回显套接字错误(套接字上次错误($sock));
出口
}
$arrOpt=array('l_onoff'=>1,'l_linger'=>1);
插座组块($sock);
socket\u set\u选项($sock,SOL\u socket,SO\u 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);
插座关闭($sock);
所面临的问题是正确接收响应,并且套接字关闭错误也返回成功(套接字上次错误的输出)。但在这之后,如果我执行netstat,我会看到端口正在使用,进程(输出/proc/pid/status)处于睡眠状态。
这种行为本质上是随机的,我在AmazonEC2云上使用的是PHP版本5.3.8。

大约是等待的时间。。。释放插座

在Linux中,运行
#/proc/sys/net/ipv4/tcp\u fin\u timeout
以了解。。。。(默认为60秒)


可能只是一个剪切/粘贴输入错误,但您缺少一个“
”;
套接字绑定()行。
此行为本质上是随机的。
-您的意思是它并不总是发生?可能是的函数,请尝试以下操作:1)在最后一行显式设置
$sock=NULL;
;2)在最后一行尝试调用。@Dave:此行为是随机的,意味着对于某些接收到的请求,套接字已正确关闭,并且所有reso资源已释放。但对于某些请求,套接字关闭未完成,netstat结果显示这些套接字仍在使用。上面的GC建议是否成功?设置$sock=NULL并调用GC\u collect\u cycles后没有更改,它返回零值。是否有办法知道调用后是否释放了所有系统资源socket_close()?