PHP Udp сокет закрыть, не освобождая системные ресурсы - PullRequest
1 голос
/ 19 марта 2012

Я использую следующий фрагмент кода в 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);

Проблема, с которой сталкиваются, состоит в том, что ответ получен правильно, и ошибка socket_close также возвращает успех (вывод socket_last_error). Но после этого, если я выполняю netstat, я вижу используемый порт и процесс (вывод / proc / pid / status) находится в состоянии сна. Такое поведение носит случайный характер, и я использую версию PHP 5.3.8 в облаке Amazon EC2.

1 Ответ

0 голосов
/ 15 октября 2014

это примерно TIME_WAIT ... чтобы освободить сокет

в Linux запустите # /proc/sys/net/ipv4/tcp_fin_timeout, чтобы выяснить .... (по умолчанию 60 секунд)

подробнее о

...