PHP ftp_put返回“无法建立数据连接:连接被拒绝”

时间:2017-02-28 17:49:24

标签: php ftp

我有一台PC通过PHP运行一些FTP,我知道它曾经在1-2个月前工作过,但现在我回到它,我发现PC不再工作了。我知道我一直在使用PC,但我想不出可能会有什么变化。

PHP正在抛出错误消息

  

无法建立数据连接:拒绝连接

...当我使用ftp_put()函数时。

我使用的减少代码是:

<?php

$trackErrors = ini_get('track_errors');
ini_set('track_errors', 1);

$server="***.***.***.***";
$port=21; 
echo "<LI>Connecting to $server:$port<BR>";
$conn_id = ftp_connect($server,$port,9999999) or die("<BR>Unable to connect to ".$server.":$port server.");
if ( !$conn_id ) {
    $errmsg = $php_errormsg;
    echo "<BR><LI>ERR:$errmsg";
}
else {
    $passive=false;
    echo "<LI>Setting Passive Mode=$passive";
    ftp_pasv($conn_id, $passive);

    $user="*********";
    $pass="*********";
    echo "<LI>Connecting as $user/*****";
    if (!ftp_login($conn_id, $user, $pass)) { 
        $msg = "Failed to login to $selected_server as $user; <BR>check logincredentials in the Settings";
        echo "<BR><LI>$msg";

        $errmsg = $php_errormsg;
        echo "<LI>ERR:$errmsg";
        return $msg;
    }

    ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10000);


    if (!@ftp_put($conn_id, "test.txt", "C:......test.txt", FTP_BINARY)) {
        echo "<BR><LI>ftp_put failed";

        $errmsg = $php_errormsg;
        echo "<LI>ERR:$errmsg";
    }
    echo "<HR>Done";
}
?>

将此作为网页运行时的输出

Connecting to ***.***.***.***:21
Setting Passive Mode=
Connecting as *******/*****
ftp_put failed
ERR:ftp_put(): Unable to build data connection: Connection refused
Done

结果是ftp_put()给出了错误消息,并在服务器上留下了一个带有正确文件名的零(0)字节文件。

奇怪的是那个

  1. 相同的代码/连接信息适用于另一台笔记本电脑确定
  2. 在推送文件时使用FileZilla可以正常使用相同的连接信息
  3. 问题发生在几台服务器上(即,它不仅仅是一个有问题的特定目的地)
  4. 此外,这似乎与被动模式无关(无论是否启用此功能都会失败)

    有没有人有任何建议?
    由于
    安倍

1 个答案:

答案 0 :(得分:4)

您正在使用活动FTP模式。在活动模式下,服务器尝试连接到客户端。在大多数网络配置中,这是不可能的,因为客户端计算机通常位于防火墙后面。

这就是服务器失败的原因:

  

无法建立数据连接:拒绝连接

针对这种情况,它具体是ProFTPD错误消息。

有关详细信息,请参阅active and passive FTP connection modes上的文章。

代码可以在其他计算机上运行,​​如果它们已禁用防火墙,或者它们的规则允许在非特权端口上传入流量。

FileZilla的工作原理是因为它默认为被动模式(正如大多数现代FTP客户端所做的那样)。

您声称也尝试了被动模式,但却收到相同的错误消息。

那是因为您错误地使用了ftp_pasv来电。

您必须在 ftp_pasv之后移动ftp_login来电

$user = "*********";
$pass = "*********";
echo "<LI>Connecting as $user/*****";
if (!ftp_login($conn_id, $user, $pass)) { 
    // ...
}

$passive = true;
echo "<LI>Setting Passive Mode=$passive";
ftp_pasv($conn_id, $passive);

The documentation清楚地表明了这一点:

  

请注意,ftp_pasv()只能在成功登录后调用,否则将失败。

对于类似的问题(仅使用Pure-FTPd),请参阅PHP upload via FTP - ftp_put() I won't open a connection to x.x.x.x (only to y.y.y.y)