0

私は を実行してCENTOS 6.3おりPHP 5.4.9、 を使用していPHP FTP commandsます。これを使用して、1 つのドメインから同じサーバー上の FTP アカウントに大きなファイルをアップロードしています。

私が気付いたのは、小さなファイルのアップロードでも、アップロードに時間がかかることです。約 10 ~ 15 秒です。彼らは最終的にアップロードします。同じスクリプトを使用して別のサーバーにアップロードすると、1 秒未満で高速にアップロードされます。

別のサーバーで同じ FTP 資格情報を使用でき、高速にアップロードされます。同じサーバー上の 1 つのドメインからの FTP が遅いのはなぜですか?

スクリプトで更新:

$ftp_server = "HOST NAME";
$ftp_user_name = "USERNAME";
$ftp_user_pass = "PASSWORD";
$ftp_folder = "/FTP DIRECTORY";
$path = "/testing/";
$file_name = $_FILES["theFile"]["name"];
$source_file = $_FILES["theFile"]["tmp_name"];
$destination_file = $ftp_folder.$path.$file_name;
$destination_path = $ftp_folder.$path;


function uploadFTP($ftp_server, $ftp_user_name, $ftp_user_pass, $source_file, $destination_file, $destination_path) {
    $conn_id = @ftp_connect($ftp_server); // set up basic connection
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // login with username and password
    if ((!$conn_id) || (!$login_result)) { // check connection 
        return false;
    } else {
        $check = @ftp_chdir($conn_id, $destination_path); //check to see if folder is there
        if ($check) { 
            $upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); // upload the file
            if (!$upload) { // check upload status
                return false;
            } else {
                return true;
            }
        } else { 
            $check = @ftp_mkdir($conn_id, $destination_path); //make new folder
            if ($check) {
                $upload = @ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); // upload the file
                if (!$upload) { // check upload status
                    return false;
                } else {
                    return true;
                }
            } else {
                return false;
            }
        }

    }
    @ftp_close($conn_id); //close ftp
}
4

1 に答える 1

1

それらが同じサーバー上にある場合は、ファイルを送信するのではなく、ファイルをコピーしてから元に戻してください。ポート 21 (FTP) がアウトバウンド接続とインバウンド接続で詰まっていると思います。

::編集::

これがコード レビューではないことは承知していますが、いくつかのマイナーな改善を加えたリビジョンを次に示します。

$ftp_server = "HOST_NAME";
$ftp_user_name = "USERNAME";
$ftp_user_pass = "PASSWORD";
$ftp_folder = "/FTP_DIRECTORY";
$path = "/testing/";
$file_name = $_FILES["theFile"]["name"];
$source_file = $_FILES["theFile"]["tmp_name"];

/**
 * OLD CODE:
 * $destination_file = $ftp_folder . $path . $file_name;
 * $destination_path = $ftp_folder . $path;
 * 
 * NEW CODE:
 * $destination_path = $ftp_folder . $path;
 * $destination_file = $destination_path . $file_name;
 * 
 * REASON FOR CHANGE: Saves you 1 concat, also, 1 less use of ftp_folder and path
 */
$destination_path = $ftp_folder . $path;
$destination_file = $destination_path . $file_name;


function uploadFTP($ftp_server, $ftp_user_name, $ftp_user_pass, $source_file, $destination_file, $destination_path) {
    /**
     * OLD CODE: 
     * $conn_id = @ftp_connect($ftp_server); # set up basic connection
     * 
     * REASON FOR CHANGE: There are times to suppress errors, this is not one of them.
     */ 
    $conn_id = ftp_connect($ftp_server) or die('Couldn\'t connect to ' . $ftp_server); # set up basic connection

    /**
     * REASON FOR NO CHANGE: ftp_login throws a warning on failure.
     */
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); # login with username and password

    if (empty($conn_id) || empty($login_result)) { # check connection 
        return false;
    } else {
        /**
         * OLD CODE:
         * $check = @ftp_chdir($conn_id, $destination_path)
         * 
         * REASON FOR CHANGE: $check is redundant
         */
        if (@ftp_chdir($conn_id, $destination_path)) { # check to see if folder is there
            /**
             * OLD CODE:
             * $upload = @ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
             * 
             * REASON FOR CHANGE: $upload is redundant
             */
            if (ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY)) { # upload the file & check upload status
                return true;
            } else {
                return false;
            }
        } else { 
            /**
             * OLD CODE:
             * $check = @ftp_mkdir($conn_id, $destination_path);
             * 
             * REASON FOR CHANGE: $check is redundant
             */
            if (@ftp_mkdir($conn_id, $destination_path)) { # make new folder
                /**
                 * OLD CODE:
                 * $upload = @ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
                 * 
                 * REASON FOR CHANGE: $upload is redundant
                 */
                if (@ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY)) { # upload the file & check upload status
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }

    }
    ftp_close($conn_id); # close ftp
}

バージョン 2:

$ftp_server = "HOST_NAME";
$ftp_user_name = "USERNAME";
$ftp_user_pass = "PASSWORD";
$ftp_folder = "/FTP_DIRECTORY";
$path = "/testing/";
$file_name = $_FILES["theFile"]["name"];
$source_file = $_FILES["theFile"]["tmp_name"];
$destination_path = $ftp_folder . $path;
$destination_file = $destination_path . $file_name;


function uploadFTP($ftp_server, $ftp_user_name, $ftp_user_pass, $source_file, $destination_file, $destination_path) {
    $conn_id = ftp_connect($ftp_server) or die('Couldn\'t connect to ' . $ftp_server); # set up basic connection
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); # login with username and password

    if (empty($conn_id) || empty($login_result)) { # check connection 
        return false;
    } else {
        if (@ftp_chdir($conn_id, $destination_path)) { # check to see if folder is there
            /**
             * OLD CODE:
             * if (ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY)) { # upload the file & check upload status
             *    return true;
             * } else {
             *    return false;
             * }
             * 
             * REASON FOR CHANGE: DRY (Don't Repeat Yourself). Abstracted code above to function.
             */
             return uploadFTP_ftpPut($conn_id, $destination_file, $source_file);
        } else {
            if (@ftp_mkdir($conn_id, $destination_path)) { # make new folder
                /**
                 * OLD CODE
                 * ...
                 * 
                 * REASON FOR CHANGE: See above.
                 */
                return uploadFTP_ftpPut($conn_id, $destination_file, $source_file);
            } else {
                return false;
            }
        }

    }
    ftp_close($conn_id); # close ftp
}

function uploadFTP_ftpPut($conn_id, $destination_file, $source_file){
    # upload the file & check upload status
    if (@ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY)) return true;
    else return false;
}

コメントなしのバージョン 3:

$ftp_server = "HOST_NAME";
$ftp_user_name = "USERNAME";
$ftp_user_pass = "PASSWORD";
$ftp_folder = "/FTP_DIRECTORY";
$path = "/testing/";
$file_name = $_FILES["theFile"]["name"];
$source_file = $_FILES["theFile"]["tmp_name"];
$destination_path = $ftp_folder . $path;
$destination_file = $destination_path . $file_name;


function uploadFTP($ftp_server, $ftp_user_name, $ftp_user_pass, $source_file, $destination_file, $destination_path) {
    $conn_id = ftp_connect($ftp_server) or die('Couldn\'t connect to ' . $ftp_server); # set up basic connection
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); # login with username and password

    if (empty($conn_id) || empty($login_result)) return false; # check connection 

    if (@ftp_chdir($conn_id, $destination_path)) { # check to see if folder is there
         return uploadFTP_ftpPut($conn_id, $destination_file, $source_file);
    } else {
        if (@ftp_mkdir($conn_id, $destination_path)) { # make new folder
            return uploadFTP_ftpPut($conn_id, $destination_file, $source_file);
        } else {
            return false;
        }
    }

    # BTW - you never get here :) 
    ftp_close($conn_id); # close ftp
}

function uploadFTP_ftpPut($conn_id, $destination_file, $source_file){
    # upload the file & check upload status
    if (@ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY)) return true;
    else return false;
}
于 2013-01-03T21:02:05.433 に答える