php stream_socket_client первый вызов занимает слишком много времени - PullRequest
0 голосов
/ 14 сентября 2018

Я открываю несколько (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 секунды или даже меньше.

1 Ответ

0 голосов
/ 14 сентября 2018

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

time nslookup $server

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

...