php ftp扩展ftp_cdup方法部分ftp服务器异常

作者:zarte    发布时间: 2020-12-21

phpftpftp_cdupCDUPfilezilla

ftp_cdup

ftp_cdup() 函数把当前目录改变为 FTP 服务器上的父目录。
若成功,则返回 true。否则返回 false。
用法:ftp_cdup(ftp_connection)

异常

实际使用中发现部分ftp服务器使用ftp_cdup方法会抛出异常

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

异常提示可知cdup执行成功了,测试发现忽略此异常并不影响之后的操作。那么为什么会有此异常呢?

测试

ftp扩展还有个ftp_raw函数可以直接执行ftp命令,所以用这个函数测试来查看服务器返回的消息。

$resp = ftp_raw($this->conn,'CDUP');
var_dump($resp);

win10自带ftp返回

250 CDUP command successful.

测试服务器返回

200 CDUP successful. "/" is current directory.

对比发现两个的返回状态码不一致

分析源码

https://www.php.net/downloads.php下载php源码。压缩包里的ext目录是扩展目录,sapi、in32、main是基本源码。
查看ftp的ftp_cdup的具体实现

int
ftp_cdup(ftpbuf_t *ftp){
    if (ftp == NULL) {          
        return 0;     
    }     
    if (ftp->pwd) {         
        efree(ftp->pwd);          
        ftp->pwd = NULL;    
    }     
    if (!ftp_putcmd(ftp, "CDUP", sizeof("CDUP")-1, NULL, (size_t) 0)) {          
        return 0;     
    }     
    if (!ftp_getresp(ftp) || ftp->resp != 250) {          
        return 0;    
    }     
    return 1;
}

发现状态码不为250的时候php认为是失败的。

ftp服务器

那么为啥有的服务器返回200有的返回250呢? 在网上找到了一个相关的讨论https://trac.filezilla-project.org/ticket/10287。 filezilla搭建的ftp服务器CDUP返回的就是200!!!

后记

Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。

根据RFC 959的规定CDUP的返回值是200,250是CWD的返回值。

同时在rfc959后续有如下补充

REPLY CODES
The CDUP command is a special case of CWD, and is included to simplify the implementation of programs for transferring directory trees between operating systems having different syntaxes for naming the parent directory. The reply codes for CDUP be identical to the reply codes of CWD.

cdup与cwd的标识码相同应为250

上一篇:  phpunit超详细使用教程

加载更多