Я открываю несколько (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 секунды или даже меньше.
Я думаю, что у вас есть проблемы с задержкой DNS. Вы можете попробовать в консоли Linux это в цикле, чтобы обнаружить это.
time nslookup $server
Если вы подтверждаете, что dns работает медленно, вы можете использовать службу NSCD для локального кэша записей.
В СЕНТОС: yum -y install nscd;systemctl enable nscd;systemctl start nscd;
и после перезапуска службы httpd. Статистика от nscd: /usr/sbin/nscd -g
Других решений пока нет …