强制破坏PHP FTP连接

时间:2011-12-01 04:21:37

标签: php

我正在使用PHP ftp函数从FTP服务器下载zip文件。我使用二进制和被动模式来获取文件。 问题是当我在ftp操作完成之前停止ftp操作(即没有调用ftp_close())并且当它再次启动时它显示以下警告 -

  ftp_login() [http://php.net/function.ftp-login]: service unavailable
  FTP connection has failed!

FTP操作失败。我已经为FTP操作编写了以下代码。

$connId = ftp_connect($host);   
$loginResult = ftp_login($connId, $user, $password);    
if ((!$connId) || (!$loginResult)) { 
    echo "FTP connection has failed!";
    exit; 
}   
ftp_pasv($connId, true);    
if (!ftp_chdir($connId, $remoteDir))
    return false;   
if (!ftp_get($connId, $localDir.$localFile,$remoteFile,FTP_BINARY))
    return false;   
ftp_close($connId);

如何强行销毁已开始以二进制模式获取文件并且连接处于被动模式的ftp连接? 重新启动计算机或删除会话cookie对我没有帮助。可能的解决办法是什么?

2 个答案:

答案 0 :(得分:1)

重新启动计算机始终会关闭该计算机所做的所有连接。

  

ftp_login()[http://php.net/function.ftp-login]:服务不可用
  FTP连接失败!

在您进入登录步骤之前,远程FTP服务器似乎正在终止连接。检查您的凭据是否正确,并检查以确保FTP服务器正常运行。

答案 1 :(得分:0)

这个问题已经很老了,但是最近我遇到了一个问题。我整理了一个快速的FTP帮助程序类,该类将自动干净地关闭连接。希望这有助于其他人寻找一种更简单的方法来执行基本的FTP操作。

//
define("SMOKE_TEST",            TRUE);
//

//  Define main FTP class.
//
class C_FTP {

    //  Connection handle.
    //
    public $h = FALSE;

    //  Close connection.
    //
    public function _Close() {
        if ($this->h) {
            ftp_close($this->h);
            $this->h = FALSE;
        }
    }

    //  Connect.
    //
    public function __construct($sDNSName) {
        $this->_Close();
        $this->h = ftp_connect($sDNSName); 
    }

    //  Destructor.
    //
    public function __destruct() {
        $this->_Close();
    }

    //  Authenticate.
    //
    public function login($sUsername = "", $sPassword = "") {
        $sError = "";
        do {
            //
            if (!$this->h) {
                $sError = "Not connected";
                break;
            }
            if (!ftp_login($this->h, $sUsername, $sPassword)) {
                $sError = "Unrecognized username or password";
                break;
            }
            ftp_pasv($this->h, TRUE); 
            //
        } while (0);
        return ($sError);
    }

    //  Change directory.
    //
    public function cd($sFolder) {
        $sError = "";
        do {
            if (!ftp_chdir($this->h, $sFolder)) {
                $sError = "Unable to change directory";
                break;
            }
        } while (0);
        return ($sError);
    }

    //  List files in current directory.
    //
    public function dir(&$aFiles) {
        $sError = "";
        do {
            if (($aFiles = ftp_nlist($this->h, ".")) === FALSE) {
                $sError = "Unable to list files in current directory";
                break;
            }
        } while (0);
        return ($sError);
    }

    //  Get file from remote site into specified local file.
    //
    public function get($sLocalFile, $sRemoteFilename) {
        $sError = "";
        do {
            if (!ftp_get($this->h, $sLocalFile, $sRemoteFilename, FTP_BINARY)) {
                $sError = "Could not perform file get";
                break;
            }               
        } while (0);
        return ($sError);
    }

    //  Put file from remote site into current directory.
    //
    public function put($sLocalFile, $sRemoteFilename) {
        $sError = "";
        do {
            if (!ftp_put($this->h, $sRemoteFilename, $sLocalFile, FTP_BINARY)) {
                $sError = "Could not perform file put";
                break;
            }               
        } while (0);
        return ($sError);
    }

//  ...end FTP class.
//  
}


//  If we are running a stand-alone test of this class,
//      set SMOKE_TEST to TRUE and invoke from CLI.
//      For example: c:\php\php C_FTP.php
//
if (SMOKE_TEST) {
    //
    function IsError($sMessage) {
        if (strlen($sMessage)) {
            echo("Error: ".$sMessage);
            return (true);
        } else {
            return (false);
        }
    }
    //
    do {
        //
        $aFiles = array();
        //
        $cFTP = new C_FTP(FTP_DNS_NAME);
        if (IsError($cFTP->login(FTP_USER, FTP_PASSWORD)))          { break; }
        if (IsError($cFTP->cd("Env")))                              { break; }
        if (IsError($cFTP->get("foo.txt", "SomeRemoteFile.txt")))   { break; }
        if (IsError($cFTP->dir($aFiles)))                           { break; }
        var_dump($aFiles);
        //
    } while (0);
    //
}
?>

请注意,这将强制采用被动模式进行数据传输,因此,如果需要主动模式,则需要进行相应的调整。