我想使用Web服务器上的ftp_rawlist来爬行我的FTP服务器。
它确实有效,但并非总是如此。
我的FTP服务器使用IIS托管在Windows服务器2016上。 这是一个简单的FTP帐户(不是FTPS且没有证书)。
我的PHP服务器运行在1and1上托管的PHP V7.2.30。 内存限制设置为128M。
代码如下(我正在使用AJAX查询页面(POST方法):
display.php
$ftp_server = "xxx.xxx.xxx.xxx";
$ftp_username = "xxxxxxxxxxx";
$ftp_userpass = "xxxxxxxxxxxxxx";
$ftp_conn = ftp_connect($ftp_server) or die("Could not connect to the FTP server");
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
$scan = ftp_get_filelist($ftp_conn, '.');
var_dump($scan);
function.php
function ftp_get_filelist($ftp_conn, $path){
$Win=false;
$contents = ftp_rawlist ($ftp_conn, $path);
$Output = array();
$i = 0;
foreach ($contents as $Current) {
$Split = preg_split('[ ]', $Current, 9, PREG_SPLIT_NO_EMPTY);
if ($Split[0] != 'total') {
$Output[$i]['isdir'] = ($Split[0] {0} === 'd');
$Output[$i]['perms'] = $Split[0];
$Output[$i]['number'] = $Split[1];
$Output[$i]['owner'] = $Split[2];
$Output[$i]['group'] = $Split[3];
$Output[$i]['size'] = $Split[4];
$Output[$i]['month'] = $Split[5];
$Output[$i]['day'] = $Split[6];
$Output[$i]['time'] = $Split[7];
$Output[$i]['full_date'] = '2020-'.$Split[5].'-'.$Split[6].' '.$Split[7];
$Output[$i]['name'] = $Split[8];
$i++;
}
}
return !empty($Output) ? $Output : FALSE;
}
所有人看上去都很奏效(但是这一年,我还没有成功实现,但这是另一个问题)。
因此,当我运行它时,好了,我有文件和文件夹的列表。 我可以继续工作, 我再次刷新,然后像加载一样,然后PHP服务器发送错误:
错误500-内部服务器错误
对于5次发生2次的错误,我真的很难调试。
我试图查看日志文件,但发现请求的错误代码为500,但没有更多信息:
xxx.xxx.xxx.xxx - - [08/May/2020:06:05:50 +0200] "POST display.php HTTP/1.1" 500 669 www.xxxxxx.com "https://xxxxxx.com/display.php" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "-"
如果有人有任何想法,将不胜感激。
谢谢
答案 0 :(得分:0)
因此,我很高兴地告诉您,我找到了解决问题的方法。 但老实说,我不理解问题的本质...
解决方案来自该线程: PHP FTP ftp_nlist not working, returning boolean false
仅在ftp_login()之后添加:
ftp_set_option($ftp_conn, FTP_USEPASVADDRESS, false); // set ftp option
ftp_pasv($ftp_conn, true); //make connection to passive mode
感谢您的@Martin时间