Intereting Posts

PHP cURL multi_exec задержка между запросами

Если я запускаю стандартную функцию 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); 

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

EDIT: Любой другой метод non-cUrl? Это также ответит на мой вопрос.

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

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

 for ($urls as $url) { $pcurl->startRequest($url); usleep(100000); } 

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

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

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

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

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

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