11.07.2019
Posted by 

В этом видео мы поговорим о тонкостях реализации многопоточной загрузки данных посредством multi curl. Готовый парсер из всего во всё. Какими способами можно ограничить количество потоков создаваемых multi curl? Например мне нужно сделать запросы по 500 url ам, но я хочу чтобы одновременно запускалось только 10 потоков? Вопрос задан более двух лет назад. 688 просмотров. В curl нет многопоточности. Ответ написан более двух лет назад. 1 комментарий.

Содержание статьи:. Что такое curl? На самом деле, curl — это больше чем просто утилита командной строки для Linux или Windows.

Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами. Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl — это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.

Команда curl Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен: curl -z 21-Dec-17 -O Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y: curl -limit-rate 50K -O Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y: curl -Y 100 -O Передача файлов Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T: curl -T login.txt ftp://speedtest.tele2.net/upload/ Или проверим отправку файла по HTTP, для этого существует специальный сервис: curl -T /login.txt В ответе утилита сообщит где вы можете найти загруженный файл. Отправка данных POST Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом: curl -d 'field1=val&fileld2=val1'Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму.

Несколько

Для этого есть опция -F: curl -F 'password=@pass;type=text/plain' Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров. Передача и прием куки Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c: curl -c cookie.txt Затем можно отправить cookie curl обратно: curl -b cookie.txt Передача и анализ заголовков Не всегда нам обязательно нужно содержимое страницы.

Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I: curl -I А опция -H позволяет или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена: curl -I -header 'If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT' Аутентификация curl Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u: curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile1.txt Точно так же будет выполняться аутентификация на серверах HTTP. Использование прокси Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x: curl -x proxysever.test.com:3128 Выводы В этой статье мы рассмотрели как пользоваться curl, зачем нужна эта утилита и основные ее возможности. Несмотря на свою схожесть с, они очень сильно отличаются. Команда curl linux предназначена больше для анализа и имитации различных действий на сервере, тогда как wget больше подходит для загрузки файлов и краулинга сайтов.

Ситуация следующая. Имеется скрипт для многопоточной загрузки с использованием multiCurl.

Так вот по моему мнению он работает как то очень медленно на localhost`е(Denver) при работе в 50 потоков 500 файлов размером 13 байт загружались 161 секунд. Встречал сообщения что multiCurl запускали работать и на URL='потоков/URL и всё работало.

В производительность компьютера скрипт точно не упирается (Core 2 Duo E8500, ОЗУ 4 Гб) повышения потребления памяти не заметил, загрузка ЦП 5-10%. А так впринципе ничего страного.

Для 500 файлов это обычное время.а при чём тут php? Не знаю как у вас но у меня копирование 500 файлов размером 13 байт происходит за несколько секунд. Насколько мне видится единственным ограничением на скорость загрузки файла будет время чтения его с HDD и обработки его WEB сервером, если бы файлы лежали где нибудь удалённо то ещё добавилось бы время задержки ответа и ограничения связанные со скорость Интернет канала. В данном случае все файлы лежат на localhoste т.е. Остаётся только время чтения файла с HDD и время обработки его WEB сервером.

Счем может быть связана более чем 170 кратная задержка в работе мне совершенно не понятно???? При запуске в одно поточном режиме те же 500 файлов загружаются за 9 секунд (Отредактировано автором: 18 Декабря, 2010 - 23:49:11). Tisar пишет: Уважаемый curl это не отдельная програма и она не может работать паралельно! Curl работает вместе с php а php читает скрипт по одной строчке и выполняет.

И никакой многопоточности тут нету. В перле есть многопоточность. Я согласен что php нет многопоточности. MultiCurl одновременно отправляет n запросов и собирает ответы и выдаёт все n ответов скрипту которые уже обрабатывает данные.

Время загрузки файлов будет равно времени загрузки самого 'медленного файла'. Быстрее получить разом n ответов чем n раз запрашивать данные т.е. Во втором случае время загрузки будет складываться из времени загрузки всех файлов по очереди.

Tisar пишет: Оу я думал вы их с удалёного сервера берёте. А зачем для локалхоста использовать curl? Copy например уже не в щёт? Это делается для тестирования чтобы избавиться от максимально возможного количества задержек. Вот именно потому что я беру файлы с localhost меня и поражает такое долгое время загрузки.

Как я уже писал выше при однопоточной загрузки загрузка всех файлов выполняется за 9 секунд, а при многопоточной она должна выполняться вообще за доли секунд. Я хотел бы услышать комментарии от человека который использовал multiCurl и мог бы подсказать почему такая хрень происходит. (Отредактировано автором: 19 Декабря, 2010 - 00:22:17). MultiCurl одновременно отправляет n запросов и собирает ответы и выдаёт все n ответов скрипту которые уже обрабатывает данные.

Ладно обьясню понятным способом на примере вашего скрипта. В функцию multiCurl передаются масив $data каждое значение это название файла. Затем вы его помещаете в цыкл foreach для разбора масива. За одни проход цыкл отдаёт одно значение, затем это значение попадает в curl и пока это одно значение НЕ обработается цыкл не даст 2 значение. Образец резюме моряка на английском. И по этому у вас получается проходоы цыкла столько сколько и файлов!

Понятно причём здесь пхп? quote=OrmaJeverЛадно обьясню понятным способом на примере вашего скрипта. В функцию multiCurl передаются масив $data каждое значение это название файла. Затем вы его помещаете в цыкл foreach для разбора масива. За одни проход цыкл отдаёт одно значение, затем это значение попадает в curl и пока это одно значение НЕ обработается цыкл не даст 2 значение. И по этому у вас получается проходоы цыкла столько сколько и файлов!

Понятно причём здесь пхп?/quote 1) OrmaJever если вы не разу не пользовались multiCurl, то зачем лезть в тему? 2) В самом конце работы цыкла foreach есть функция. Я же лишь скажу что иногда тебе вовсе не нужна страница, а лишь её заголовки, как в нашем примере авторизации. Еще не нужно для каждого запроса создавать в памяти экземпляр механизма curl. Один раз его инициализируем, потом просто меняем параметры и адрес url. Думаю этого вполне хватит для успешного обмена данным с другими сайтами по началу, ну а если не хватит, то можно рассмотреть несколько сложных случаев далее. Несколько параллельных запросов и curlmultiinit Если бы нам нужно было бы получить допустим содержания трех страниц, то наверное мы бы отправили запрос сначала на одну, получили результат, отправили на вторую и потом только на третью.

Но вот чудо - эта библиотека позволяет отправить запрос сразу в 3 источника параллельно, при этом затратить на все это дело столько же времени сколько на один запрос. quoteПрочитайте описание функции на этом сайте. Там на жолтеньком написано Внимание/quote то что на данном ресурсе информации об этой функции нет не означает что её нет вообще. Обращайтесь к первоисточникам: quote=OrmaJeverЕсли бы так было была бы сказка quote про эту сказку спросите у одного из более опытного участника ( ) данного форума, раньше когда у меня возникали вопросы про multiCurl он мне хорошо помог (Отредактировано автором: 19 Декабря, 2010 - 08:53:33). Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)0/0.

Колличество загрузок(потоков):1 Затрачено времени на загрузку контрольного файла: 0 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)17/17. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)1/1. Колличество загрузок(потоков):1 Всего файлов/Ошибок: 500/0 Затрачено времени: 162 лог работы без usleep. Ункция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)0/0.

Колличество загрузок(потоков):1 Затрачено времени на загрузку контрольного файла: 0 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16.

Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16.

Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Php Curl Несколько Потоков

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)16/16.

Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)17/17. Колличество загрузок(потоков):50 Функция multiCurl завершена.

Curl Несколько Потоков

Время работы всей функции/получение загружаемых данных (do while)16/16. Колличество загрузок(потоков):50 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)0/0. Колличество загрузок(потоков):1 Всего файлов/Ошибок: 500/0 Затрачено времени: 161 т.е.

99% времени выполняется загрузка файлов, только почему так долго?? (Добавление) Статистика работы цикла do while Загружено: 3 за 0.04 Загружено: 1 за 0.78809 Загружено: 1 за 0.373 Загружено: 4 за 0.3 Загружено: 15 за 0.6211 Загружено: 1 за 7.8 Загружено: 3 за 0.2043 Загружено: 1 за 0.25146 Загружено: 1 за 0.851 Загружено: 3 за 0.529 Загружено: 2 за 0.953 Загружено: 8 за 0.3896 Загружено: 2 за 0.83 Загружено: 3 за 0.14 Загружено: 1 за 7.9 Функция multiCurl завершена. Время работы всей функции/получение загружаемых данных (do while)6069752. Колличество загрузок(потоков):50 Из чего видно что по какой то причине некоторые файлы загружаются очень медленно 7 секунд (Отредактировано автором: 19 Декабря, 2010 - 14:53:02). Все тесты проводились на localhost (Denver), так что сетевые задержки можно исключить.

Хочу с начало всё отладить на localhoste, а уже потом когда допишу всё требуемое, выносить на сервер. В такой же теме на форуме antichat ( ) было выдвинуто предположение что у меня скрипт упирается в допустимое количество потоков Апача. Я тоже к этому склоняюсь. Загрузка тех же 500 файлов в 24 потока происходит за 3 секунды, а в 25 потоков за 161 секунду. В настройках (c: WebServers usr local apache conf extra httpd-mpm.conf) в Апаче нашёл переменную ThreadsPerChild =25 изменил на 60 и всё заработало.