使用MLSD和fsockopen的PHP ftp原始函数:奇怪的阻塞行为和警告消息

问题描述 投票:1回答:1

我目前遇到FTP的ftp_raw功能问题。

我需要获得一个非常精确和详细的FTP目录文件和目录列表(ftp_rawlist不够精确,具有日期时间并且未指定)。所以我想使用更规范化的命令:MLSD

我可以得到我想要的文件列表,但是从套接​​字获取数据后,不可能再使用PHP的ftp*函数了...

这是我的代码的摘录:

//Current folder = "/"
$directory = "/www/";

$currentFolder = ftp_pwd($ftpStream);
echo $currentFolder;
echo ' : ';
ftp_chdir($ftpStream, $directory);

$ret = ftp_raw($ftpStream, 'PASV');

if (preg_match('#^227.*\(([0-9]+,[0-9]+,[0-9]+,[0-9]+),([0-9]+),([0-9]+)\)$#', $ret[0], $matches)) {
    $controlIp = str_replace(',', '.', $matches[1]);
    $controlPort = intval($matches[2]) * 256 + intval($matches[3]);
    $socket = fsockopen($controlIp, $controlPort);
    ftp_raw($ftpStream, 'MLSD');
    $s = '';
    while (!feof($socket)) {
        $s .= fread($socket, 4096);
    }
    fclose($socket);
}

echo ftp_pwd($ftpStream); //line 256
echo ' --> ';
ftp_chdir($ftpStream, $currentFolder); //line 258

echo ftp_pwd($ftpStream); //line 260

显示:

/ :    <br />
<b>Warning</b>:  ftp_pwd(): Transfer complete. in <b>/media/sf_web/x/webService/models/Ftp.class.php</b> on line <b>256</b><br />
--><br />
<b>Warning</b>:  ftp_chdir(): &quot;/www&quot; is current directory. in <b>/media/sf_web/x/webService/models/Ftp.class.php</b> on line <b>258</b><br />
<br />
<b>Warning</b>:  ftp_pwd(): CWD command successful. in <b>/media/sf_web/x/webService/models/Ftp.class.php</b> on line <b>260</b><br />

那时错误不一致。

有关信息,如果我评论整个“If”条件块,我得到一个正常的行为,没有警告:

/ : /www --> /
*/

哪里可能是我的错?如何解释不连贯的警告信息以及之后无法正确使用$ftpStream

我一直在寻找一个小时的解决方案,所以你的帮助将非常感激...... :)

先感谢您。

php sockets ftp
1个回答
1
投票

PHP现在支持MLSD命令nativelly,因为7.2带有ftp_mlsd function


原始答案:

MLSD作为所有FTP数据传输命令,发出多个响应。

通常一个或多个1xx初步回复,如

150 Opening data channel for directory listing of "/path"

在您的情况下,最后一个回复:

226 Transfer complete.

ftp_raw函数只读取一个响应,即前一个150响应。保持最终的226响应“在队列中”。

一旦你发出一个新的FTP命令,即PWD,它就会找到待处理的226响应,然后就此停止。

实际的PWD响应再次“留在队列中”:

257 /www is current directory.

等等。

您收到警告,因为状态代码与命令不匹配。对PWD的积极回应是257,而不是226。对CWD的积极回应是250,而不是257等。

我担心没有办法同步,因为没有PHP函数来跳过/读取FTP回复。

因此,您唯一的选择可能是再次断开连接。

© www.soinside.com 2019 - 2024. All rights reserved.