- Автор темы
- #1
Подскажите, как к этому скрипту добавить функцию ftp, чтобы закачивать файлы на сервер в многопоточном режиме
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Не пашет скрипт, а вообще можно ли реализовать в php чтобы несколько файлов одновременно грузились по фтп еще другими способами?Вставить вместо комментария
свой код по заливке на ftp чего ты там куда хочешь залить.PHP:// presumably doing something interesting
(new Image()).src='http://mysite.com/myscript.php?param=1'
Да у меня винда мультикурл, кстати есть у меня скрипт, для многопоточной скачки веб страниц с одного сайта, незнаю как точно его изменить чтобы фтп грузитьНу самый простой способ - это запустить несколько скриптов. Это элементарно делается, легко настраивается, не требует никаких синхронизаций и прочего и работает везде. Просто тупо в командной строке запускаешь сколько тебе надо скриптов и каждому из них передаешь параметрами его личную порцию работы (список файлов, которые надо залить).
Если хочется повозиться, или нету доступа к командной строке, а надо обязательно через бровзер - есть изврат с аяксом. Это когда открываешь страничку, а она аяксом через тот же хотя бы
запускает несколько копий нужного тебе скрипта, и показывает какой из них когда завершился. Способ аналогичный первому, но более тяжелый для сервера.PHP:(new Image()).src='http://mysite.com/myscript.php?param=1'
Если еще больше хочется повозиться - вот та вот штука с pcntl. Не знаю, почему у тебя не работает. Может потому что у тебя винда? )))
Всякие multicurl и прочие действительно правильные способы рекомендую даже не рассматривать. Это в сто раз сложнее, а результат какой? Результат тебе нужен - параллельная заливка, а это проще сделать плодя новые 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);
local/folder/file1.jpg
local/folder/file2.jpg
...
$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";
/usr/bin/php myscript.php 0
/usr/bin/php myscript.php 1
/usr/bin/php myscript.php 2
..
Всякие multicurl и прочие действительно правильные способы рекомендую даже не рассматривать. Это в сто раз сложнее, а результат какой?