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

zxxx

Постоялец
Регистрация
9 Окт 2009
Сообщения
148
Реакции
4
Подскажите, как к этому скрипту добавить функцию ftp, чтобы закачивать файлы на сервер в многопоточном режиме
 
Вставить вместо комментария
PHP:
  // presumably doing something interesting
свой код по заливке на ftp чего ты там куда хочешь залить.
 
  • Нравится
Реакции: zxxx
Вставить вместо комментария
PHP:
  // presumably doing something interesting
свой код по заливке на ftp чего ты там куда хочешь залить.
Не пашет скрипт, а вообще можно ли реализовать в php чтобы несколько файлов одновременно грузились по фтп еще другими способами?
 
Ну самый простой способ - это запустить несколько скриптов. Это элементарно делается, легко настраивается, не требует никаких синхронизаций и прочего и работает везде. Просто тупо в командной строке запускаешь сколько тебе надо скриптов и каждому из них передаешь параметрами его личную порцию работы (список файлов, которые надо залить).

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

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

Всякие multicurl и прочие действительно правильные способы рекомендую даже не рассматривать. Это в сто раз сложнее, а результат какой? Результат тебе нужен - параллельная заливка, а это проще сделать плодя новые php-процессы, чем извращаясь внутри одного. Да, памяти так жрется больше, да, неэкономно, ну так тебе на память посрать, у тебя в канал все упрется намного раньше чем закончится память, так что экономить ее смысла нет.
 
  • Нравится
Реакции: zxxx
Ну самый простой способ - это запустить несколько скриптов. Это элементарно делается, легко настраивается, не требует никаких синхронизаций и прочего и работает везде. Просто тупо в командной строке запускаешь сколько тебе надо скриптов и каждому из них передаешь параметрами его личную порцию работы (список файлов, которые надо залить).
Если хочется повозиться, или нету доступа к командной строке, а надо обязательно через бровзер - есть изврат с аяксом. Это когда открываешь страничку, а она аяксом через тот же хотя бы
PHP:
(new Image()).src='http://mysite.com/myscript.php?param=1'
запускает несколько копий нужного тебе скрипта, и показывает какой из них когда завершился. Способ аналогичный первому, но более тяжелый для сервера.
Если еще больше хочется повозиться - вот та вот штука с pcntl. Не знаю, почему у тебя не работает. Может потому что у тебя винда? )))
Всякие multicurl и прочие действительно правильные способы рекомендую даже не рассматривать. Это в сто раз сложнее, а результат какой? Результат тебе нужен - параллельная заливка, а это проще сделать плодя новые php-процессы, чем извращаясь внутри одного. Да, памяти так жрется больше, да, неэкономно, ну так тебе на память посрать, у тебя в канал все упрется намного раньше чем закончится память, так что экономить ее смысла нет.
Да у меня винда :) мультикурл, кстати есть у меня скрипт, для многопоточной скачки веб страниц с одного сайта, незнаю как точно его изменить чтобы фтп грузить

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($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $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);
 
Еще раз говорю, забей!
Возьми свои урлы, которые тебе надо закачивать, собери их в файлик 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
Назад
Сверху