cURL Multi Threading с PHP

Я использую cURL для получения данных рангов для более чем 20 000 доменных имен, которые я сохранил в базе данных.

Код, который я использую, это http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading .

Массив $ competeRequests составляет 20 000 запросов на compete.com api для ранжирования сайтов.

Это пример запроса: http://apps.compete.com/sites/stackoverflow.com/trended/rank/?apikey=xxxx&start_date=201207&end_date=201208&jsonp= ";

Поскольку есть 20 000 этих запросов, я хочу разбить их на куски, поэтому для этого я использую следующий код:

foreach(array_chunk($competeRequests, 1000) as $requests) { foreach($requests as $request) { $curl->addSession( $request, $opts ); } } 

Это отлично подходит для отправки запросов партиями в 1000, однако сценарий занимает слишком много времени для выполнения. Я увеличил max_execution_time до 10 минут.

Есть ли способ отправить 1000 запросов из моего массива, затем проанализировать результаты, затем вывести обновление состояния, а затем продолжить следующую 1000, пока массив не станет пустым? На данный момент экран просто остается белым все время исполнения скрипта, которое может составлять более 10 минут.

Related of "cURL Multi Threading с PHP"

Это всегда делает работу для меня … https://github.com/petewarden/ParallelCurl

Вышеприведенный ответ устарел, поэтому правильный ответ должен быть одобрен.

http://php.net/manual/en/function.curl-multi-init.php

Теперь PHP поддерживает выборку нескольких URL одновременно.

Существует очень хорошая функция, написанная кем-то, http://archevery.blogspot.in/2013/07/php-curl-multi-threading.html

Вы можете просто использовать его.

https://github.com/krakjoe/pthreads

введите описание изображения здесь

Вы можете писать на PHP, код, изображенный, является просто ужасным программированием потоков, и я не советую, как вы это делаете, но хотел показать вам накладные расходы на 20 000 потоков … это 18 секунд, на моем текущем оборудовании, которое представляет собой Intel G620 (двухъядерный) с 8 гигабайтами памяти, на серверном оборудовании вы можете ожидать гораздо более быстрых результатов … как вы выполняете такую ​​задачу в зависимости от ваших ресурсов и ресурсов службы, которую вы запрашиваете …

Поместите это в начало своего php-скрипта:

 set_time_limit(0); @apache_setenv('no-gzip', 1);//comment this out if you use nginx instead of apache @ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); } ob_implicit_flush(1); 

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

Обратите внимание на комментарий строки apache_setenv если вы используете веб-сервер nginx вместо apache.

Обновление для nginx:

Таким образом, OP использует nginx, что делает вещи немного сложнее, поскольку nginx не позволяет отключить компиляцию gzip с PHP. Я также использую nginx, и я только что узнал, что он по умолчанию активен, см .:

 cat /etc/nginx/nginx.conf | grep gzip gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

поэтому вам нужно отключить gzip на nginx.conf и перезапустить nginx:

/etc/init.d/nginx restart

или вы можете играть с параметрами gzip_disable или gzip_types , чтобы условно отключить gzip для некоторых браузеров или для некоторых типов содержимого страниц соответственно.