Многопоточная заливка

Тема в разделе "PHP", создана пользователем zxxx, 31 май 2011.

Модераторы: latteo
  1. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    Подскажите, как к этому скрипту добавить функцию ftp, чтобы закачивать файлы на сервер в многопоточном режиме

    Перейти по ссылке
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Вставить вместо комментария
    PHP:
      // presumably doing something interesting
    свой код по заливке на ftp чего ты там куда хочешь залить.
     
    zxxx нравится это.
  3. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    Не пашет скрипт, а вообще можно ли реализовать в php чтобы несколько файлов одновременно грузились по фтп еще другими способами?
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Ну самый простой способ - это запустить несколько скриптов. Это элементарно делается, легко настраивается, не требует никаких синхронизаций и прочего и работает везде. Просто тупо в командной строке запускаешь сколько тебе надо скриптов и каждому из них передаешь параметрами его личную порцию работы (список файлов, которые надо залить).

    Если хочется повозиться, или нету доступа к командной строке, а надо обязательно через бровзер - есть изврат с аяксом. Это когда открываешь страничку, а она аяксом через тот же хотя бы
    PHP:
    (new Image()).src='http://mysite.com/myscript.php?param=1'
    запускает несколько копий нужного тебе скрипта, и показывает какой из них когда завершился. Способ аналогичный первому, но более тяжелый для сервера.

    Если еще больше хочется повозиться - вот та вот штука с pcntl. Не знаю, почему у тебя не работает. Может потому что у тебя винда? )))

    Всякие multicurl и прочие действительно правильные способы рекомендую даже не рассматривать. Это в сто раз сложнее, а результат какой? Результат тебе нужен - параллельная заливка, а это проще сделать плодя новые php-процессы, чем извращаясь внутри одного. Да, памяти так жрется больше, да, неэкономно, ну так тебе на память посрать, у тебя в канал все упрется намного раньше чем закончится память, так что экономить ее смысла нет.
     
    zxxx нравится это.
  5. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    Да у меня винда :) мультикурл, кстати есть у меня скрипт, для многопоточной скачки веб страниц с одного сайта, незнаю как точно его изменить чтобы фтп грузить

    PHP:
    for ($i 1$i 77$i++) {
        
    $urls[$i] = "http://site.com/?p=$i";


    $cmh curl_multi_init();
     

    $tasks = array();

    foreach (
    $urls as $url) {


        
    $ch curl_init($url);

        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);

        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

        
    curl_setopt($chCURLOPT_HEADER0);

        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT10);

        
    curl_setopt($chCURLOPT_TIMEOUT10);

        
    $tasks[$url] = $ch;

        
    curl_multi_add_handle($cmh$ch);
    }
     

    $active null;

    do {
        
    $mrc curl_multi_exec($cmh$active);
    }
    while (
    $mrc == CURLM_CALL_MULTI_PERFORM);


    while (
    $active && ($mrc == CURLM_OK)) {

        if (
    curl_multi_select($cmh) != -1) {

            do {
                
    $mrc curl_multi_exec($cmh$active);

                
    $info curl_multi_info_read($cmh);

                if (
    $info['msg'] == CURLMSG_DONE) {
                    
    $ch $info['handle'];

                    
    $url array_search($ch$tasks);


                    
    $tasks[$url] = curl_multi_getcontent($ch);
    $name=str_replace(array('/',':','?','='),'_',$url);
    $fp fopen("app/sites/".$name.".txt""w");
    fwrite($fp,$tasks[$url]."\n");
    fclose($fp);

                    
    curl_multi_remove_handle($cmh$ch);

                    
    curl_close($ch);

                }
            }
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    curl_multi_close($cmh);
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Еще раз говорю, забей!
    Возьми свои урлы, которые тебе надо закачивать, собери их в файлик files.txt (под виндой команда dir /b /s > files.txt)
    Код:
    local/folder/file1.jpg
    local/folder/file2.jpg
    ...
    
    напиши скрипт, который берет параметр из $argv[1] и тянет кусок файла
    PHP:
     $tasks 10;
     
    $from = (int) $argv[1];
     
    $files array_slice(file('files.txt',6), $from*$tasks$tasks);
     foreach(
    $files as $file) {
        
    // upload $file to your ftp
     
    }
     echo 
    "$from done\n";
    И запусти себе хоть 40 копий этого скрипта
    Код:
    /usr/bin/php myscript.php 0
    /usr/bin/php myscript.php 1
    /usr/bin/php myscript.php 2
    ..
    
    Каждая копия будет брать десять файлов из files.txt и заливать. И все они будут работать параллельно.
     
    zxxx нравится это.
  7. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    Призыв человека отказаться думать, ведет не к чему другому, как к безусловной его деградации. Да и к тому же что сложного в том, что бы банально взять пример из документации и добавить туда свой код? Другое конечно дело, что тот же pcntl в windows не работает, и потому для ТС не подходит. Но зачем же делать говнокод? Можно взять например не блокируемые сокеты и сделать с их помощью. Вот Перейти по ссылке, который думаю не составит труда переделать, к тому же даст опыт работы с ftp протоколом, что в нашей жизни никогда не помешает.