PHP cURL multi_exec задержка между запросами - PullRequest
3 голосов
/ 08 августа 2011

Если я запускаю стандартную функцию cURL_multi_exec (пример ниже), я получаю все дескрипторы cURL, запрошенные одновременно.Я хотел бы поставить задержку в 100 мс между каждым запросом, есть ли способ сделать это?(ничего не найдено в поиске Google & StackOverflow)

Я пытался использовать usleep () перед curl_multi_exec (), которая замедляет выполнение сценария, но не откладывает каждый запрос.

// array of curl handles & results
$curlies = array();
$result = array();
$mh = curl_multi_init();

// setup curl requests
for ($id = 0; $id <= 10; $id += 1) {
    $curlies[$id] = curl_init();
    curl_setopt($curlies[$id], CURLOPT_URL,            "http://google.com");
    curl_setopt($curlies[$id], CURLOPT_HEADER,         0);
    curl_setopt($curlies[$id], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $curlies[$id]);
}

// execute the handles
$running = null;
do {
    curl_multi_exec($mh, $running);
} while($running > 0);

// get content and remove handles
foreach($curlies as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
}

// all done
curl_multi_close($mh);

ЯРаботая над этим весь день, любая помощь будет принята с благодарностью!Спасибо.

РЕДАКТИРОВАТЬ: Любой другой метод не-cUrl?Это также ответило бы на мой вопрос.

Ответы [ 4 ]

3 голосов
/ 08 августа 2011

Да, это возможно. Если вы используете библиотеку ParallelCurl , вы можете намного проще добавить задержку в 100 мс с помощью usleep(), поскольку вы можете сделать отдельный запрос для добавления в очередь загрузки.

for ($urls as $url) {
    $pcurl->startRequest($url);
    usleep(100000);
}
2 голосов
/ 08 августа 2011

Не думай, что сможешь. Если вы запустите это из cli, вы можете вместо этого разложить ваш скрипт на 10 процессов и затем запускать регулярные запросы curl от каждого. Это позволит вам точно контролировать время.

1 голос
/ 10 августа 2011

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

Вы можете сделать это с помощью Python легко, и в случае неблокирования вызовов в реальном времени к конечным точкам API вы должны использовать такие вещи, как Socket.IO + Node.JS или просто Node.JS, ну, да ... lol

В случае, если у вас нет времени и вы не можете использовать такие вещи:

http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html

На самом деле все зависит от того, чего вы пытаетесь достичь.

0 голосов
/ 20 июня 2013

Вы можете попробовать это:
Сохраните отметку времени в БД, добавьте один дескриптор и вызовите curl_multi_exec.
Используйте CURLOPT_PROGRESSFUNCTION, чтобы проверить время и добавить дополнительные дескрипторы, когда вам это нужно.
Здесь Даниэль Стенберг (автор cURL и libcurl) говорит, что можно добавить больше дескрипторов после выполнения curl_multi_exec.

...