Casey Landreth
Casey Landreth

Reputation: 51

Slow upload on same domain

I'm running CENTOS 6.3 and PHP 5.4.9, using the PHP FTP commands. I'm using this to upload large files from one domain to an FTP account on the same server.

What I've noticed is that the uploads for even small files take a long time to upload: around 10 to 15 seconds. They do eventually upload. If I use the same script to upload to a different server it uploads fast: under a second.

I can use the same FTP credentials on a different server and they upload fast. Why is FTP from the one domain on the same server slow?

Updated With Script:

$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
}

Upvotes: 0

Views: 525

Answers (1)

jsanc623
jsanc623

Reputation: 534

If they're on the same server, why not just copy the files over instead of sending them out, then taking them back in? I think you're clogging up port 21 (FTP) with outbound and inbound connections.

::EDIT::

I know this is not code review, but here's a revision with a handful of minor improvements:

$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
}

Version 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;
}

Version 3 without comments:

$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;
}

Upvotes: 1

Related Questions