Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / и снова CURL - multi mode (php) / 3 сообщений из 3, страница 1 из 1
27.02.2014, 12:46
    #38574004
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова CURL - multi mode (php)
З А Д А Ч А

значит глобальная задача, которой я занимаюсь заключаеться в том, дабы паралельно запускать скачивание файлов.

сразу 1 НО !!
читал статьи где человек предлагает глупый вариант работы курла, просто он этого не замечает скачивая стартовые страницы яндекса и мейл ру. А вот если качать файл в 40МБ и видеть что он с локалхоста на локалхост качаеться по 100-300кб/сек - то не правильность работы очевидна.

2 НО
работа предполагаеться следующая

ОБОЗНАЧЕНИЯ
С-старт
К-конец
П-процес скачивания
Д - другая работа не связаная с цурлом совсем

получаем
1Д С1 С2
2Д П1 П2 С3
3Д К1 П2 П3 С4
4Д П2 К3 К4
.....


тоесть вариант сразу имеем 10 заданий, и качаем пока не скачаем все 10 не подходит.
...
Рейтинг: 0 / 0
27.02.2014, 13:18
    #38574067
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова CURL - multi mode (php)
alex564657498765453,

П О Д З А Д А Ч А № 1

Имеем несколько закачек, надо скачать не теряя зря времени и не делая холостых циклов

я остановился на таком варианте
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//INIT
$mh = curl_multi_init();
curl_multi_add($mh,curl_init($link_for_download1));
curl_multi_add($mh,curl_init($link_for_download2));
curl_multi_add($mh,curl_init($link_for_download3));

//START
do
{
  $mrc = curl_multi_exec($mh, $still_running);
}
while($mrc == CURLM_CALL_MULTI_PERFORM);
//in new version - cycle runs a single time


//PROCESS
while($still_running > 0)
{
   $mrc = curl_multi_select($mh, $time_limit_for_freeze);
  
   if ($mrc == -1)
   {
      usleep(10000); //POINT1
   }
   elseif($mrc > 0)
   {
      //curl_multi_info_read 
      //curl_multi_remove_handle
   }

   do
   {
     $mrc = curl_multi_exec($mh, $still_running);
   }
   while($mrc == CURLM_CALL_MULTI_PERFORM);
}



PS
curl_multi_exec теперь ни когда не возвращает CURLM_CALL_MULTI_PERFORM
но пишем код чтоб автоматом использовать этот ответ при старой версии либкурла

POINT1
как я понял, функция селект особено в начале выдаёт -1 пока осуществляеться подключение
и поэтому гнать цикл вхолостую - не ускоряет процес закачки, но увеличивает нагрузку на процессор.

собственно вопросы уже возникает сдесь

верно ли я рассуждаю?
что означает ответ -1 у curl_multi_select? (php.net читал)

по тестам, без задержки в 10000 мс не качаеться быстрее.
тоесть вначале вхолостую будет крутиться цикл, никакой записи на винчестер(скачиваемые файлы) нету.

как можно всётаки замёрзнуть вначале, пока там чтото инициализируеться.

раньше было проще - я знал, что если ответ CURLM_CALL_MULTI_PERFORM, то вызвать повторно curl_multi_exec
теперь как быть?

ЗЫ
для тестов спецом качал один файл большой статический, другой маленький, но выдаёться по 4кб через интервалы в пол секунды, третий - просто фраза хеллоу но выдаёться с задержкой 10 сек.

пользоваться вариантом без селекта, втупую вызывать в цикле curl_multi_exec
- получим пару десятков холостого цикла вызова этой функции
а с селектом акуратно код замерзает пока третий источник данных 10 секунд тормозит перед выдачей.
...
Рейтинг: 0 / 0
27.02.2014, 13:21
    #38574076
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова CURL - multi mode (php)
alex564657498765453,

поправка, работа без селекта, получим пару дясятков тысяч холостого хода цикла. и 100% загрузку ядра процессора.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / и снова CURL - multi mode (php) / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]