gpt4 book ai didi

php - 带有MLSD和fsockopen的PHP的ftp_raw函数: weird blocking behaviour and Warning messages

转载 作者:行者123 更新时间:2023-12-03 12:04:45 25 4
gpt4 key购买 nike

我目前在使用FTP的ftp_raw函数时遇到问题。

我需要获得FTP目录的文件和目录的非常精确和详细的列表(ftp_rawlist对于datetimes不够精确,因此未指定)。所以我想使用更规范的命令: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

我一直在寻找解决方案数小时,因此,非常感谢您的帮助... :)

先感谢您。

最佳答案

从7.2开始,PHP现在就支持MLSD命令 ftp_mlsd function

原始答案:

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

通常是一个或多个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回复。

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

关于php - 带有MLSD和fsockopen的PHP的ftp_raw函数: weird blocking behaviour and Warning messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31525081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com