2014-09-15 3 views
0

Вот часть моего кода:stream_socket_client замерзает в течение 5 секунд

while(true) 
{ 
    $socket_options = array(
     'socket' => array(
      'bindto' => 'X.X.X.X:0' 
     ) 
    ); 
    $context = stream_context_create($socket_options); 
    $fp = stream_socket_client('tcp://mywebsite.com:80', $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $context); 
    fclose($fp); 
} 

Кажется, что Eveything работает отлично, за исключением некоторого времени или времени делать $fp = stream_socket_client(...) занимает около 5 секунд. Обычно это занимает около 0,05 секунды.

Как вы можете видеть, я добавил тайм-аут в 1 секунду, который игнорируется. И через 5 секунд все работает нормально.

С tcpdump я попытался посмотреть, что происходит: например, в 18:00:00 мы запускаем функцию $fp = stream_socket_client(...). У tcpdebug нет никакой ошибки и никаких следов. В 18:00:05, эта функция размораживается и таким образом мы получили первый след в tcpdebug:

18:00:05.383328 IP4 XXX.39881 > YYY: Flags [S], seq 888461900, win 28800, options [mss 1440,sackOK,TS val 132651022 ecr 0,nop,wscale 7], length 0 
18:00:05.385622 IP4 YYY > XXX.39881: Flags [S.], seq 2116836106, ack 888461901, win 14280, options [mss 1440,sackOK,TS val 1826003082 ecr 132651022,nop,wscale 7], length 0 

Этот человек, кажется, сталкиваются с той же проблемой, без решения: PHP stream_socket_client ignoring timeout

Edit

После некоторых тестов, одни и те же проблемы, происходит с socket_create:

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_bind($sock, 'X.X.X.X');   
socket_connect($sock, 'mywebsite.com', 80); 
[...] 
socket_close($sock); 

Вот некоторые ответы раз для некоторых IP:

X.X.X.18 : 5.2102129459381 
X.X.X.29 : 5.1817638874054 
X.X.X.11 : 5.2263398170471 
X.X.X.78 : 5.2547619342804 
X.X.X.56 : 5.1963429450989 
X.X.X.24 : 5.1876528263092 
+0

Какова цель while-loop 'while (true) {'? –

+0

Я постоянно обновляю информацию на сервере mywebsite.com. – Kevin

+0

Это бинго: задержка происходит во время 'socket_connect'. При прямом использовании IP-адреса все работает нормально! – Kevin

ответ

1

Не игнорируя свое 1 секунду ожидания, что время не тратятся попытками подключения. Задержка, которую вы видите, зависит от поиска DNS, потому что вы передаете имя хоста, а не IP-адрес.

Это не быстрый вид деятельности. Вы не хотите этого делать. Используйте IP-адрес.

Смежные вопросы