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);
}

Кажется, что все работает нормально, кроме некоторого времени или времени для $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 игнорирует тайм-аут

редактировать

После некоторых тестов такие же проблемы случаются с 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

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]