Jump to content
  • 0

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


andyarus
 Share

Question

$content = CURL_FTP($url, 0, 0);
$arr = explode("\r\n", $content);
foreach($arr as $v) $v !== '' ? $ftpfiles[] = $v : '';
foreach($ftpfiles as $v) $deletearray[] = 'DELE '.$v;
CURL_FTP($url, 0, 1);

function CURL_FTP($url, $upload=0, $delete=0){
global $useragent, $infile, $filetoupload, $deletearray;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FTPLISTONLY, 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 = curl_exec($ch);

if(curl_errno($ch)){
echo 'Curl error: ' . curl_error($ch);
}

curl_close($ch);

return $content;
}

цель - удалить все.

достигается, если нет папок.

если есть, вылазит ошибка.

пробовал отделять папки, но не работает на ftp!


foreach($ftpfiles as $v) !is_dir($v) ? $deletearray[] = 'DELE '.$v : '';

1 вопрос - как на фтп отделить папки и файлы

2 вопрос - с помощью какой команды удаляются папки. файлы удаляются (DELE имя файла)

3 если нет команды для папок, как удалить все с ftp?

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

я пробовал эти функции. но были тормоза, срабатывало через раз. кароч так и не догнал в чем дело, заюзал курл. работает моментально.

есть команда типа DELE, но чтобы удаляла папки?

Link to comment
Share on other sites

  • 0

я пробовал эти функции. но были тормоза, срабатывало через раз. кароч так и не догнал в чем дело, заюзал курл. работает моментально.

есть команда типа DELE, но чтобы удаляла папки?

RMD

  • Like 1
Link to comment
Share on other sites

  • 0

не все так просто оказалось, как хотелось бы. RMD удаляет только пустые папки.

накатал велосипед, но он катится(удаляет файлы) в 4 раза медленнее FileZilla.

хелп оптимизировать быдлокод?

?<?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:password@ftp.host.ru
//ftp://login2:password@ftp.host.ru
//ftp://login3:password@ftp.host.ru

$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;">huinya какая-то! (<i>не все файлы удалились. возможно проблема с CURLOPT_TRANSFERTEXT или правами на файлы</i>)</b><br />';
}

continue;

}



if((round((round(microtime(1)-$mtbegin, 2))/60)) > 1){
echo '<br />Всего времени затрачено: '; echo '~'.round((round(microtime(1)-$mtbegin, 2))/60) .' мин<br /><br />';
} else {
echo '<br />Всего времени затрачено: '; echo '~'.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;
}



?>

Link to comment
Share on other sites

  • 0

у меня почти так и сделано. только в цикле удаляются папки, а файлы сразу сносятся (CURLOPT_QUOTE, array('file1','file2','fileN'); ).

скрипт делает то, что я хочу. но медленно! в 4 раза медленнее FileZilla! вопрос - какие у меня недочеты в коде? как ускорить?

Edited by andyarus
Link to comment
Share on other sites

  • 0

у меня почти так и сделано. только в цикле удаляются папки, а файлы сразу сносятся (CURLOPT_QUOTE, array('file1','file2','fileN'); ).

скрипт делает то, что я хочу. но медленно! в 4 раза медленнее FileZilla! вопрос - какие у меня недочеты в коде? как ускорить?

А фаилзилла запускается на той же машине где скрипт? канал связи до ftp одинаковый?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy