cakephp stream_socket_client первый вызов занимает слишком много времени

Я открываю несколько (75) потоков через stream_socket_client() а затем обрабатывает его stream_select(), Первый вызов этого метода занимает ок. 15 секунд и я понятия не имею, почему. Следующие вызовы выполняются намного быстрее — менее одной или двух секунд для всего метода. Я отследил проблему до foreach, где открываются соединения, что само по себе занимает 14/15 секунд.

Код:

foreach ($tlds as $index => $server ) {

$ip = gethostbyname($server);
$con = @stream_socket_client($ip.':43',$errno, $errstr, 10, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);

usleep(200);

if (!$con) {
$fails[] = $server;
} else {
$calls[$index] = $con;
stream_set_blocking($calls[$index], false);
}

//get time here
}

Результаты тестирования:

╔════════╦══════════╦══════════╗
║ $index ║ 1st call ║ 2nd call ║
╠════════╬══════════╬══════════╣
║ 0      ║ 5s       ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 10     ║ 6s       ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 20     ║ 7s       ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 30     ║ 9s       ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 40     ║ 11s      ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 50     ║ 12s      ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 60     ║ 13s      ║ 0s       ║
╠════════╬══════════╬══════════╣
║ 70     ║ 14s      ║ 1s       ║
╠════════╬══════════╬══════════╣
║ end    ║ 14s      ║ 1s       ║
╚════════╩══════════╩══════════╝

Я совсем не разбираюсь в программировании сокетов, поэтому я рад любым советам.

PHP 7.1, Apache / 2.4.6 (CentOS)

Спросите любую информацию, которая вам нужна — надеюсь, я смогу ответить.

Примечание. Иногда второй вызов по-прежнему занимает около 1/3 времени первого вызова. Но следующие звонки — около 1 секунды или даже меньше.

2

Решение

Я думаю, что у вас есть проблемы с задержкой DNS. Вы можете попробовать в консоли Linux это в цикле, чтобы обнаружить это.

time nslookup $server

Если вы подтверждаете, что dns работает медленно, вы можете использовать службу NSCD для локального кэша записей.
В СЕНТОС: yum -y install nscd;systemctl enable nscd;systemctl start nscd; и после перезапуска службы httpd. Статистика от nscd: /usr/sbin/nscd -g

1

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

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

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