3

我正在尝试为我的服务器的 cPanel 帐户使用自动备份脚本。
我已经在一台带有 FileZilla Server 的本地机器上安装了一个 FTP 服务器。我可以使用 FileZilla 客户端、Plesk 服务器和 lftp 成功连接和传输文件...
服务器只接受加密连接并且启用了被动模式。

由于某些未知原因,尝试使用 PHP 连接和放置文件时,响应是:

警告:ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in
/home/xxxxxxx/public_html/lab/test/perform_mysql_bk.php on line 326

对这个错误有什么想法吗?

对于我正在使用的连接:

$fSuccess = false;

$sServerAddress = $this->m_aConfig['FTP_SERVER_ADDRESS'];
$iServerPort = (int)( $this->m_aConfig['FTP_SERVER_PORT'] );

// set up FTP connection
if ( ($this->m_aConfig['FTP_USE_SSL'] == 'YES') ) {

    if ( function_exists('ftp_ssl_connect') ) {
        $this->m_oFtpConnection = ftp_ssl_connect( $sServerAddress, $iServerPort );

        if ( !$this->m_oFtpConnection ) {
            $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." with SSL+FTP failed. Will fallback to normal FTP." );
        }
        else {
            $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." with SSL+FTP Succeeded. Now logging in ..." );
        }
    }
    else {
        $this->writeLog( "This server doesn't support FTPS (FTP with SSL). Will fallback to normal FTP." );
    }
}

//Fallback
if ( !$this->m_oFtpConnection ) {
    $this->m_oFtpConnection = ftp_connect( $sServerAddress, $iServerPort );
}

// login after a successful connection
if ( $this->m_oFtpConnection ) {
    $fLoginResult = ftp_login( $this->m_oFtpConnection, $this->m_aConfig['FTP_USERNAME'], $this->m_aConfig['FTP_PASSWORD'] ); 
    //echo $fLoginResult;
}
else {
    $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." failed." );
}

// check connection
if ( (!$this->m_oFtpConnection) || (!$fLoginResult) ) { 
    $this->writeLog( "FTP connection has failed!" );
} else {
    $this->writeLog( "FTP connection was successful with ".$sServerAddress.":".$iServerPort );
    $fSuccess = true;
}

// Set to Passive connection if login was successful and this setting was set.
if ( $fSuccess && ($this->m_aConfig['FTP_USE_PASSIVE'] == 'YES') ) {

    if ( ftp_pasv( $this->m_oFtpConnection, true ) ) {
        $this->writeLog( "FTP connection was set to PASSIVE mode." );
    }
    else {
        $this->writeLog( "Attempted to set FTP connection to PASSIVE mode but failed. Going to continue with copy anyway. If the script fails, review this as a possible source." );
    }
}

响应成功:(我已经用xx值替换了我的IP)

尝试使用 SSL+FTP 连接到 xx.xx.xx.xx:21 成功。现在登录...
FTP 连接成功,xx.xx.xx.xx:21
FTP 连接设置为 PASSIVE 模式。

但是当系统遇到这个时:

$fSuccess = false;

$sDestinationFile = $this->m_aConfig['FTP_PATH_TO_COPY'] . $insDbFileName;

// upload the file
$fUpload = ftp_put( $this->m_oFtpConnection, $sDestinationFile, $insDbFileName, FTP_BINARY ); 

// check upload status
if (!$fUpload) { 
    $this->writeLog( "FTP upload has failed! Check the log file for errors. Try changing PASSIVE and SSL options in the config." );
    return false;
} else {
    $this->writeLog( "Uploaded $insDbFileName to ".$this->m_aConfig['FTP_SERVER_ADDRESS']." as $sDestinationFile" );
    $fSuccess = true;
}

return $fSuccess;

响应是错误

警告:ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in
/home/xxxxxxx/public_html/lab/test/perform_mysql_bk.php on line 326

我已经阅读了很多页面说这个错误是由 FTP 服务器返回内部 IP 地址而不是公共 IP 地址引起的,但是我已经用其他程序进行了测试并且一切运行正常,执行 PASV 命令时 FTP 服务器正在发送公共 IP .

有任何想法吗?

4

3 回答 3

9
ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);

设置被动连接之前的这行代码 ftp_pasv($ftpconn, true); 挽救了我的生命。

于 2019-12-24T13:08:49.420 回答
1

我有同样的问题,通过将 ftp 服务器 ip 添加到防火墙允许 ip 列表来解决

于 2019-03-03T06:33:59.623 回答
1

PHP 代码和 curl 的类似行为表明防火墙正在阻止数据连接。

由于未加密的连接正常工作,防火墙很可能通过监视 FTP 控制连接并自动转发控制连接中发现的数据连接端口而变得“智能”。但这不适用于加密会话,因为防火墙无法监控它们。

另请参阅我的指南中有关 FTP 网络设置的“智能防火墙/NAT”部分。

如果您需要允许加密连接,您需要与服务器管理员交谈。

于 2017-06-27T17:31:17.280 回答