Reputation: 51
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
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