Открытие тысяч ручек cURL без проблем?(PHP) - PullRequest
3 голосов
/ 27 ноября 2010

Мне нужно использовать cURL в PHP для выполнения тысяч запросов cURL к API.В настоящее время я планирую делать это параллельно с функциями curl_multi_ ().В основном для одновременного выполнения всех тысяч запросов cURL одновременно.

Я слышал, что вы можете столкнуться с проблемами с памятью, открыв слишком много дескрипторов, что может привести к фатальным ошибкам.Как можно избежать этого и по-прежнему выполнять мои URL-запросы как можно быстрее?

Если мне нужно ограничить количество запросов cURL, которые должны быть сделаны за один раз, что будет хорошим # для установки ограничения на?

Предыстория: я нахожусь на общем хостинге с Godaddy прямо сейчас, что хорошо с запросами cURL, хотя я не проверял это с тысячами параллельных запросов.В будущем я буду на сайте Rackspace Cloud , который может справиться со скромной нагрузкой.

Это огромное количество запросов cURL - это раз в год, а не часть ежедневного сайта.операции.

Ответы [ 4 ]

5 голосов
/ 27 ноября 2010

Это звучит как архитектурная проблема.Зачем вам нужно делать тысячи запросов одновременно?Такого рода пареллизм пойдет на пользу, или вы случайно натолкнетесь на DOS (отказ в обслуживании) с каким-то плохим подозрительным веб-сервисом / API?

Предполагается, что вы не загоняете ни одного удаленного сервераВам все еще нужно беспокоиться о том, сколько соединений может обрабатывать ваш локальный компьютер.Есть только так много портов, которые вы можете использовать для исходящих, и они измеряются в десятках тысяч.Нетрудно достичь этого предела, если вы сходите с ума, открывая соединения.Любой, кто перегрузил нагрузочное тестирование с помощью Apachebench, знает это.

PHP не является отличным инструментом для такого рода вещей - и я парень, который делает PHP на 90%.Там нет потоков, и это интенсивно использует память.Если вы хотите, чтобы 1000 PHP процессов выполнялись параллельно, вам понадобится более одной машины.Ваш типичный процесс PHP потребляет около 10-20 мегабайт памяти, если только вы не отключите его (вероятно, во время компиляции.

) Вы говорите, что это происходит раз в год. Это заставляет меня думатьМожет быть, в этом нет необходимости, все, что нужно. Что если бы у вас было только 24 или 36 параллельных процессов?

Тем не менее, вот как я мог бы подойти к этому. PHP, вероятно, будет работать нормально, и если вы столкнетесьПроблемы неэффективности памяти, вы можете поменять только одну часть. Вам нужны две, более или менее асинхронные очереди и пара процессов, которые работают на них:

  • A "очередь выборки«- рабочая очередь HTTP-запросов, которые необходимо выполнить. Они выполняют запрос и помещают данные в очередь обработки (см. следующий пункт).

  • « Очередь обработки »aрабочая очередь, которая работает с любыми HTTP-ответами. Так же, как обрабатывается очередь, она может добавлять новые элементы в «выборочную очередь»

  • Какой-то процесс (или пара десятков), которые выполняются вппараллельно работает над очередью выборки.Параллелизм здесь хорош, так как у вас так много задержек из-за сети.

  • Какой-то процесс, который жует «очередь на обработку» - не ясно, поможет ли здесь параллелизм.Вся эта обработка происходит локально и, вероятно, может быть простым циклом.

1 голос
/ 23 января 2014

Все вещи, предложенные timdev, обернуты в Zebra cURL https://github.com/stefangabos/Zebra_cURL., вы можете передать массив URL-адресов, и он будет помещать в очередь некоторые (по умолчанию 10) параллельно, а затем вызывать их и передавать объект результата в обратный звонок. Из документов Github:

    <?php
        function callback($result) {
            // remember, the "body" property of $result is run through
            // "htmlentities()", so you may need to "html_entity_decode" it
            // show everything
            print_r('<pre>');
            print_r($result->info);
        }
        require 'path/to/Zebra_cURL.php';
        // instantiate the Zebra_cURL class
        $curl = new Zebra_cURL();
        // cache results 60 seconds
        $curl->cache('cache', 60);
        // get RSS feeds of some popular tech websites
        $curl->get(array(
            'http://rss1.smashingmagazine.com/feed/',
            'http://allthingsd.com/feed/',
            'http://feeds.feedburner.com/nettuts',
            'http://www.webmonkey.com/feed/',
            'http://feeds.feedburner.com/alistapart/main',
        ), 'callback');
    ?>

Это очень быстро и приятно на использование памяти

1 голос
/ 20 февраля 2013

Выезд Роллинг Керл .Я использовал его для извлечения ссылок и содержимого веб-страниц из нескольких страниц веб-страниц.Я понятия не имею, как это будет работать на сервере, так как я работаю только на локальных машинах.

0 голосов
/ 27 ноября 2010

Недостаточно информации на самом деле.Какая пропускная способность будет использоваться для каждого соединения?если это не пара байтов, вы закроете большинство соединений, открывая столько сокетов одновременно.Даже если ваша учетная запись ограничена, ваша идея 1000 сокетов окажется узкой и бессмысленной.Почему вы не можете открыть 100 сокетов и зациклить, как только один завершает.это очень быстро

...