удаление файлов ftp curl php

andyarus

Новичок
скрипт для удаления всего с ftp. работает в 4 раза медленнее FileZIlla. в чем проблема? укажите, плз, явные недочеты в логике.

PHP:
<?php

set_time_limit(0);
ob_implicit_flush(1);
ob_end_flush();
$mtbegin = microtime(1);

$useragents = str_replace("\r\n", '', file('useragents.txt'));

//формат
//ftp://login1:[email protected]
//ftp://login2:[email protected]
//ftp://login3:[email protected]

$count = file('loginsftp.txt');
for($i=0;$i<count($count);$i++){

$useragent = $useragents[mt_rand(0, count($useragents)-1)];

$logins = str_replace("\r\n", '', file('loginsftp.txt'));
$url = array_shift($logins);
file_put_contents('loginsftp.txt', implode("\r\n", $logins));

$result = CURL_FTP($url, 0, 0);
$content = $result['content'];
$arr = explode("\r\n", $content);
$ftp = '';
foreach($arr as $v) $v !== '' ? $ftp[] = $v : '';
if($ftp == ''){
    echo $i+1 .' '.$url.' <b style="color:green;">пусто!</b><br />';
    continue;
} else {
    $files = ''; $dirs = '';
    foreach($ftp as $v) preg_match("#\.#", $v) ? $files[] = 'DELE '.$v : $dirs[] = $v;
    if($files !== '') $result = CURL_FTP($url, $files, 0, 1);
    if($result['errno'] == 21) $files = ''; $dirs = ''; foreach($ftp as $v) !is_dir($url.'/'.$v) ? $files[] = 'DELE '.$v : $dirs[] = $v;
    if($dirs !== ''){
        for($a=0;$a<count($dirs);$a++){
            $urldir = $url.'/'.$dirs[$a].'/';
            $result = remove_ftp($urldir);
            if($result == true) continue;
        }
    }
  }

$result = CURL_FTP($url, 0, 0);
if(strlen($result['content']) == 0){
    echo $i+1 .' '.$url.' <b style="color:maroon;">файлы удалены!</b><br />';
} else {
    echo $i+1 .' '.$url.' <b style="color:red;">kuinya какая-то! (<i>не все файлы удалились. возможно проблема с CURLOPT_TRANSFERTEXT или правами на файлы</i>)</b><br />';
}

continue;

}



if((round((round(microtime(1)-$mtbegin, 2))/60)) > 1){
echo '<br />Всего времени затрачено: '; echo '&#126;'.round((round(microtime(1)-$mtbegin, 2))/60) .' мин<br /><br />';
} else {
echo '<br />Всего времени затрачено: '; echo '&#126;'.round(microtime(1)-$mtbegin, 2) .' сек<br /><br />';
}



function remove_ftp($url){
    $result = CURL_FTP($url, 0, 0);
    $content = $result['content'];
    $arr = explode("\r\n", $content);
    $ftp = '';
    foreach($arr as $v) $v !== '' ? $ftp[] = $v : '';
    $dir = preg_replace("#ftp://.+/#U", "", $url);
    $urldir = preg_replace("#/[^@:/]+/$#U", "/", $url);
    if($ftp == ''){
        $dir = array("RMD $dir");
        CURL_FTP($urldir, $dir, 0, 1);
        return true;
    }
    
    $files = ''; $dirs = '';
    foreach($ftp as $v) preg_match("#\.#", $v) ? $files[] = 'DELE '.$dir.$v : $dirs[] = $v;
    if($files !== '') $result = CURL_FTP($urldir, $files, 0, 1);
    if($result['errno'] == 21) $files = ''; $dirs = ''; foreach($ftp as $v) !is_dir($url.'/'.$v) ? $files[] = 'DELE '.$v : $dirs[] = $v;
    if($dirs !== ''){
        for($b=0;$b<count($dirs);$b++){
            $urldir = $url.$dirs[$b].'/';
            $result = remove_ftp($urldir);
            if($result == true) continue;
        }
    }
    remove_ftp($url);
}



function CURL_FTP($url, $deletearray, $upload=0, $delete=0){
    global $useragent, $infile, $filetoupload;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
    //curl_setopt($ch, CURLOPT_TRANSFERTEXT, 1); // если нет бинарных файлов (картинки, фавиконы и тп), вроде как работает быстрее
    if($upload == 1){
        curl_setopt($ch, CURLOPT_UPLOAD, 1);
        curl_setopt($ch, CURLOPT_INFILE, $infile);
        curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filetoupload));
    }
    
    $delete == 1 ? curl_setopt($ch, CURLOPT_QUOTE, $deletearray) : '';
    
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    $content['content'] = curl_exec($ch);
    
    $content['errno'] = curl_errno($ch);
    //if(curl_errno($ch) !== 21){
    //    echo 'Curl errornumber: ' . curl_errno($ch) . '<br />';
    //    echo 'Curl error: ' . curl_error($ch);
    //}
    curl_close($ch);
    
    return $content;
}



?>
 

tz-lom

Продвинутый новичок
CURL

на каждый запрос удаления файла происходит соединение с FTP , авторизация,удаление и потом соединение закрывается
FileZilla не отключается от сервера пока ты явно это не потребуешь (и ещё канал поддерживает посылая ping раз в определённое время, чтобы сервер с своей стороны не рвал соединение)
 

andyarus

Новичок
т.е. авторизация - DELE file1 - quit; авторизация - DELE file2 - quit; авторизация - DELE file3 - quit ?
не догоняю почему соединение закрывается, я же не шлю команду quit?
 

andyarus

Новичок
не утешило, я уже там был.
хочу на курле сделать. работает. но медленнее FileZilla в 4 раза, что не айс.

CURL шлёт, он так работает
дай плиз ссылку, где это подтверждается? чот я не уверен, что curl сам шлет CURLOPT_QUOTE, array('quit')
 

tz-lom

Продвинутый новичок
действительно,посмотрел как оно написано и работает - разрывает соединение при curl_close
в принципе в этом то и проблема,curl_close вызвается у вас довольно часто,вам это не нужно
так же посмотрите в активном или пассивном режиме вы работаете с FTP (общей рекомендации какой лучше - нет)
 
Сверху