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

use*_*181 3 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";
}
?>
Run Code Online (Sandbox Code Playgroud)

作为网页运行时的输出是

<?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";
}
?>
Run Code Online (Sandbox Code Playgroud)

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

奇怪的是

  1. 相同的代码/连接信息可以在另一台笔记本电脑上正常工作
  2. 推送文件时,使用FileZilla可以使用相同的连接信息
  3. 该问题在多台服务器上发生(即,不仅仅是一个特定的目的地出现了问题)

此外,这似乎与被动模式无关(启用和未启用此模式都会失败)

有没有人有什么建议?
谢谢安

Mar*_*ryl 6

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

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

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

在这种情况下,特别是ProFTPD错误消息。

有关详细信息,请参见我关于主动和被动FTP连接模式的文章。


如果已禁用防火墙或具有允许在非特权端口上传入流量的规则,则该代码可以在其他计算机上工作。

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);
Run Code Online (Sandbox Code Playgroud)

该文档明确建议:

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


对于类似的问题(仅对于Pure-FTPd),请参见通过FTP上传PHP-ftp_put()我不会打开与xxxx(仅与yyyy)的连接