[PHP] MultiCurl загрузить файлы на FTP

T
На сайте с 28.06.2007
Offline
82
1264

Как с помощью Curl загрузить файлы на FTP в многопоточном режиме?

Испробовал уже кучу вариантов, но не смог найти решения. Вот последний вариант функции, как только не извращался, излазил весь интернет в поисках решения, не работает и всё :(

function multiFTP($url, $chis)  

{

$i = 1;
$active=0;

$mh = curl_multi_init();

do {
if ($active<$chis) //Количество потоков
{
$i++;
$conn[$i]=curl_init();
$remoteurl[$i] = "ftp://LOGIN:PASS@FTP/".$url[$i];
$fp[$i] = fopen($url[$i], "rb");
curl_setopt($conn[$i], CURLOPT_URL, $remoteurl[$i]);
//curl_setopt($conn[$i],CURLOPT_TIMEOUT, 10);
curl_setopt($conn[$i], CURLOPT_UPLOAD, 1);
curl_setopt($conn[$i], CURLOPT_INFILE, $fp[$i]);
curl_setopt($conn[$i], CURLOPT_INFILESIZE, filesize($url[$i]));
curl_multi_add_handle ($mh,$conn[$i]);
}
curl_multi_exec($mh,$active); usleep(100);
} while ($active);

curl_multi_close($mh);
}

Trol добавил 05.01.2011 в 11:27

Неужели никто не использует CURL для FTP? :(

Какие тогда есть варианты кроме CURL? Для многопоточной загрузки данных?

FORK не поддерживается так как Windows :(

[Удален]
#1

Еле нашел. Может поможет. Для одного парсера писал когда-то давно:


<?php
/**
* simple wrapper class for curl_multi
* @author NemodeN
*
* @version 1.0
*/

class CurlMulti {

private $contents = array();
private $handles = array();
private $curlopts = array(
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FAILONERROR => TRUE,
CURLOPT_FOLLOWLOCATION => FALSE,
CURLOPT_TIMEOUT => 10,
CURLOPT_HEADER => FALSE,
);

function __construct($arr) {
if (!is_array($arr) || empty($arr)) {
return false;
}

foreach ($arr as $a) {
$this->handles[$a] = curl_init($a);
curl_setopt_array($this->handles[$a], $this->curlopts);
}
}

/**
* initiates multicurl and runs curl get against all instances
* @return void
*/
public function run() {
$mh = curl_multi_init();
foreach ($this->handles as $ch) {
curl_multi_add_handle($mh, $ch);
}

$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);

foreach ($this->handles as $link=>$ch) {
$this->contents[$link] = curl_multi_getcontent($ch);
}

foreach ($this->handles as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
}

/**
* getter of the $content
* @return array
*/
public function getContents() {
return $this->contents;
}
}

Пользоваться просто.

$pages = array('www.firstpage.com', 'www.secondpage.com', 'www.thirdpage.com');
$parser = new CurlMulti($pages);
$parser->run();
$parsedPages = $parser->getContents();

echo $parsedPages['www.firstpage.com']; // выводим содержимое страницы www.firstpage.com
echo $parsedPages['www.secondpage.com']; // выводим содержимое страницы www.secondpage.com

ну и т.д.

Следует учесть, то что писалось это за 20 минут, соответственно тут никакого error handling'а в помине нет, а настройки вбиваются непосредственно в коде.

Ну и конечно зафурычит только с PHP 5

T
На сайте с 28.06.2007
Offline
82
#2

So1, спасибо.

Весь день сегодня думал в чём дело и так не додумался :( Как-то удалось сделать и работало (прадо не всё, а только первый поток), потом что-то изменил и опять не могу вспомнить что добавил )))) Работает криво то 5 файлов закачается, то вообще ничего...

C
На сайте с 15.07.2008
Offline
59
#3

На php.net в комментариях к соответствующим функциям есть много примеров с пояснениями.

_vb_
На сайте с 25.07.2009
Offline
104
#4

я на php не шарю, но если по аналогии, то

curl_setopt($conn[$i], CURLOPT_NOSIGNAL, 1);

должно спасти отца русской демократии.

Саратовская фракция серча (). Давайте посчитаемся.
T
На сайте с 28.06.2007
Offline
82
#5

Спасибо всем за помощь.

Сделал закрытие файла через fclose. Теперь на FTP закачивается каждый раз только 4 файла и всё :(

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий