ftp_connect PHP问题

时间:2017-02-24 12:02:49

标签: php ftp

我有一个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);

?>

2 个答案:

答案 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);
}

您没有说明您的脚本报告的状态与结果之间存在什么关联。部分文件是一件值得关注的事情。处理事务性文件传输时,有多种选项可确保传输的完整性:

  • 将文件捆绑在单个实体中,允许完整性验证(例如,使用PGP / GPG签名)。这需要在服务器上进行额外处理
  • 在成功上传文件时从客户端重命名文件(应该是原子文件并避免服务器在上传时处理文件) - 请注意许多现代文件传输服务器实现此服务器端 - 目标文件名直到数据上传成功完成。
  • 在服务器上放置一个锁定文件以指示传输正在进行中 - 之后将其删除
  • 在上传成功完成后,在远程服务器上放置一个信号量文件,以便服务器上的处理知道该文件可用
  • 使用权限标记转移状态