我有一个PHP脚本连接到外部FTP服务器,并将4个txt文件传输到本地服务器。一个文件比其他文件大,但它们通常最多只有几百KB。当它运行时,它有时会失败,有时会传输部分文件,有时是一个而不是其他文件。它永远不会成功转移所有。
已经检查了权限并手动测试FTP帐户显示它很好并且连接和传输平稳而快速。我尝试过切换到ASCII但没有成功。
我使用此脚本连接的帐户不是SFTP,但我转移到的本地服务器仅为SFTP(1& 1)。我不确定这是否相关,并不能解释间歇性。感谢。
<?php
ini_set('display_errors', 1);
$ftp_server = "*";
$ftp_user_name = "*";
$ftp_user_pass = "*";
// define some variables
$local_file[0] = 'updates/vebraproperties.txt';
$local_file[1] = 'updates/files.txt';
$local_file[2] = 'updates/rooms.txt';
$local_file[3] = 'updates/vebraclients.txt';
$server_file[0] = 'vebraproperties.txt';
$server_file[1] = 'files.txt';
$server_file[2] = 'rooms.txt';
$server_file[3] = 'vebraclients.txt';
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
echo $login_result . '<br/>';
for($i = 0; $i <= 3; $i++) {
// try to download $server_file and save to $local_file
if (ftp_get($conn_id, $local_file[$i], $server_file[$i], FTP_BINARY)) {
echo "Successfully written to " . $local_file[$i] . "\n<br/>";
} else {
echo "There was a problem \n";
}
}
// close the connection
ftp_close($conn_id);
?>
答案 0 :(得分:1)
您可以尝试使用passive mode。
您可以在登录后设置:
...
// Login
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// Set passive mode
ftp_pasv($conn_id, true);
...
答案 1 :(得分:0)
FTP糟透了。真的很糟糕。您应该非常努力地找到一种在不依赖它的情况下移动文件的方法。
但我转移的本地服务器只是SFTP(1&amp; 1)
嗯?这没有任何意义。 FTP时,SFTP完全不同。 ftp_函数不适用于“仅SFTP”服务器。如果它确实是SFTP服务器,则使用ssh2_sftp_命令。
如果它有时有效,有时不会在不更改代码的情况下运行,那么原因不是代码(这实际上是在这里提出问题),而是在其他地方(网络,服务器)。
话虽如此,你确实有责任使代码合理健壮,例如
$login_result=false;
for ($x=0; $x<4 && !$login_result; $x++) {
usleep($x*300);
$conn_id = is_resource($conn_id) ? $conn_id : ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
}
您没有说明您的脚本报告的状态与结果之间存在什么关联。部分文件是一件值得关注的事情。处理事务性文件传输时,有多种选项可确保传输的完整性: