php7.3 ftp_cdup() 在某些 FTP 服务器中抛出 "CDUP successful" 异常

php7.3 ftp_cdup() throws "CDUP successful" exception in some FTP servers

for($i=1;$i<=$path_div;$i++)         
{
    try{
        $res = ftp_cdup($this->conn);
        if(!$res){
            throw new \Exception('ftp_cdup fail');
        }
    }catch (\Exception $e){
        /**
         * :ftp_cdup(): CDUP successful. "/" is current directory
         */
        if(strpos($e->getMessage(),'ftp_cdup(): CDUP successful')>=0){
            //normal
        }else{
            throw new \Exception('ftp_cdupfail:'.$e->getMessage());
        }
    }
}

例外是

ftp_cdup(): CDUP successful. "/" is current directory

其实这是正常的。

首先,我不认为 ftp_cdup(或任何其他 PHP FTP 函数)会抛出任何异常。您可能有一些错误处理程序 converts PHP warnings into exceptions,不是吗?


无论如何,PHP 期望服务器以代码 250 响应成功的 CDUP 命令。您的服务器可能会响应其他一些 2xx 成功代码(如普通 200)。我不认为 PHP 就在这里。而且我认为您真的无能为力。

除了使用 ftp_cdup,您还可以:

$resp = ftp_raw("CDUP");

并检查 $resp 中的 2xx 代码。

或者只使用 ftp_chdir 而不是 ftp_cdup


我不认为 FTP RFC 959 真的要求响应必须是 200。这只是一个例子。问题可能来自 CWDCDUP 示例中的不一致。我希望两者都使用相同的代码。但是 RFC 显示 CWD 为 250,而 CDUP 为 200。甚至 RFC 也说:“CDUP 的回复代码与 CWD 的回复代码相同。”