Скачать все содержимое с FTP-сервера без ограничения по времени - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу загрузить содержимое (файлы, папки и подпапки) каталога с FTP-сервера, используя PHP.

Я смог сделать это с помощью этой функции:

function ftp_sync ($dir) { 

    global $conn_id; 

    if ($dir != ".") { 
        if (ftp_chdir($conn_id, $dir) == false) { 
            echo ("Change Dir Failed: $dir<BR>\r\n"); 
            return; 
        } 
        if (!(is_dir($dir))) 
            mkdir($dir); 
        chdir ($dir); 
    } 

    $contents = ftp_nlist($conn_id, "."); 
    foreach ($contents as $file) { 

        if ($file == '.' || $file == '..') 
            continue; 

        if (@ftp_chdir($conn_id, $file)) { 
            ftp_chdir ($conn_id, ".."); 
            ftp_sync ($file); 
        } 
        else 
            ftp_get($conn_id, $file, $file, FTP_BINARY); 
    } 

    ftp_chdir ($conn_id, ".."); 
    chdir (".."); 

}

Источник: https://stackoverflow.com/a/5650503/10349407

Но через некоторое время;сценарий отключен от браузера, потому что он занимает много времени, так как содержимое папки велико.

Я попытался установить:

ini_set('max_execution_time', 0);
set_time_limit(0);

, но я все еще получаю ошибку Warning: set_time_limit() has been disabled for security reasons поскольку я на общем хостинге.

Итак, мой вопрос: возможно ли выполнять перенаправления в вышеупомянутой функции PHP, чтобы она запускала новую страницу для каждого загружаемого файла (это мое предложение, чтобы предотвратитьпредел тайм-аута)

Итак, строка вроде:

header("Location: " . __FILE__ . "?file=$file");

, где он должен загрузить файл со значением $_GET['file'], затем перенаправить снова и так до тех пор, пока не завершится загрузка всегосодержание.

РЕДАКТИРОВАТЬ: Это моя попытка, но она не работает: /

function ftp_sync ($dir) { 

    global $conn_id; 

    if( isset($_GET['cd']) ) {
        $dir = $_GET['cd'];
    }

    if ($dir != ".") { 
        if (ftp_chdir($conn_id, $dir) == false) { 
            echo ("Change Dir Failed: $dir<BR>\r\n"); 
            return; 
        } 
        if (!(is_dir($dir))) 
            mkdir($dir); 
        chdir ($dir); 
    } 

    $contents = ftp_nlist($conn_id, "."); 
    foreach ($contents as $file) { 

        if ($file == '.' || $file == '..') 
            continue; 

        if (@ftp_chdir($conn_id, $file)) { 
            ftp_chdir ($conn_id, ".."); 
            ftp_sync ($file); 
            header("refresh:0.5;url=" . "ftp.php" . "?file=$file&cd=" . ftp_pwd($conn_id));
            die();
        } 
        else {
            ftp_get($conn_id, $file, $file, FTP_BINARY); 
        }
    } 

    ftp_chdir ($conn_id, ".."); 
    chdir (".."); 

} 

1 Ответ

0 голосов
/ 24 декабря 2018

Я наконец сделал это сам!

Все, что мне было нужно, это способ рекурсивного перечисления ВСЕГО содержимого FTP-сервера (файлы, каталоги, подкаталоги).

И я нашел этот класс: https://www.phpclasses.org/package/7707-PHP-List-recursively-all-files-in-a-FTP-server.html

Итак, все, что вам нужно сделать, это загрузить этот класс и написать этот скрипт, на котором я потратил часы (хотя это простой xD).

<?php
error_reporting(0);
set_time_limit(0);
session_start();

// SETTINGS
$ftp_hostname = "";
$ftp_port = 21;
$ftp_username = "";
$ftp_password = "";
$where_to_download = "."; // Without the last slash!
// ---------------------

// NOTE: If you want to end the current session; go to http://example.com/filename.php?end

if( isset($_GET['end']) ) {
    session_unset();
    session_destroy();
    die("Successfully ended the session.");
}

include("ftpcrawler.php");
$ftpcrawler = new ftpcrawler;
$ftpcrawler->server = "ftp://$ftp_username:$ftp_password@$ftp_hostname:$ftp_port/";
if( !isset($_SESSION['array']) ) {
    $_SESSION['array'] = $ftpcrawler->crawl();
}
if( empty($_SESSION['array']) ) {
    echo "Finished downloading everything , or theres no files to download.";
    session_unset();
    session_destroy();
    die();
}
foreach($_SESSION['array'] as $item) {
    if( $item['type'] == "file" ) {
        $ITEM_DIRECTORY = str_replace($item['name'], "", $item['path']);
    }
    if( $item['type'] == "directory" ) {
        $ITEM_DIRECTORY = $item['path'];
    }
    if (!file_exists($where_to_download . $ITEM_DIRECTORY) && !is_dir($where_to_download . $ITEM_DIRECTORY)) {
        mkdir($where_to_download . $ITEM_DIRECTORY, 0777, TRUE);         
    }
    if( $item['type'] == "file" ) {
        $data = @file_get_contents("ftp://$ftp_username:$ftp_password@$ftp_hostname:$ftp_port" . $item['path']);
        file_put_contents($where_to_download . $item['path'], $data);
    }
    unset($_SESSION['array'][$item['path']]); // Remove the item from the array.
    echo "Downloaded/Created Folder " . $item['path'] . " !";
    header( "refresh:0.2;url=" . basename(__FILE__) );
    die();
}
?>

Сохраните файл с нужным именем и убедитесь, что ftpcrawler.php находится в том же каталоге скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...