Forum Webscript.Ru
Программирование => PHP => Тема начата: X-Disa от 09 Апреля 2007, 01:06:18
-
Пишу систему индексации фтп серверов. В общем-то все хорошо, сканит и работает достаточно быстро.
Однако столкнулся с парой проблем.
Система работает двумя способами. После соединения с сервером, скрипт пробует рекурсивный запрос:
ftp_rawlist($ident,$dir,true);
Если результата нет, то делает обычный ftp_rawlist (и далее ходит по папкам).
В случае с рекурсивным запросом такая трабла — результат не всегда содержит полный листинг. Можно ли это как-то отследить? И в чем может быть проблема?
Далее, если используется обычный метод сканирования.
Результат от ftp_rawlist обрабатывается в цикле, и если там папка, ее содержимое опять же запрашивается через ftp_rawlist.
Проблема 1. Срабатывает не на всех папках. Частично решение найдено, если нет результата, используется ftp_nlist. Однако, в некоторых случаях, результата все равно нет. С чем это может быть связано?
Проблема 2. Некоторые серверы (при обычном сканировании) периодически просто рвут соединение. Опять же, частичное решение в виде: если !ftp_chdir($link,"/"), то сделать реконнект и продолжить сканирование помогает не всегда.
Проблема 3. Иногда уходит в бесконечный цикл, путь при этом выглядит так: сервер/папка/папка/папка/папка... Решение в виде провеки существования папки по этому пути помогло, однако, хотелось бы знать причину.
-
Предположил бы, что ты не проверяешь папки: \'.\' и \'..\' тоесть если посмотришь список то будут всегда содержатся две эти папки. от этого возможно зацикливание или сервера рвут соединение.
-
X-Disa:
Проблема 3. Иногда уходит в бесконечный цикл, путь при этом выглядит так: сервер/папка/папка/папка/папка... Решение в виде провеки существования папки по этому пути помогло, однако, хотелось бы знать причину.
Попробуй рекурсивный вызов функции, вот кусок кода из моего роекта. Работает на ура
// FTP rec rawlist
function ftp_rec($dir)
{
GLOBAl $connid, $_GLOBVAR, $_CONFIG, $ziparray, $tmparray;
// Get raw file listing
$list = ftp_rawlist($connid, $dir);
// Iterate listing
foreach($list as $val) {
// Split the data into chunks
$split = preg_split(\'[ ]\', $val, 9, PREG_SPLIT_NO_EMPTY);
// Skip pointers
if ($split[8] === \'.\' || $split[8] === \'..\') continue;
$newname = $dir . \'/\' . $split[8];
if ($split[0]{0} === \'d\') {
// echo $newname." DIR
";
ftp_rec($newname);
} else {
//echo $new_name." FILE
";
$new_name = str_replace("$_GLOBVAR[chdir]/", "", $newname);
array_push($tmparray, $tmpname = str_replace("\\\\", "/", tempnam($_CONFIG[\'tmppath\'], "zip")));
ftp_get($connid, $tmpname, $newname, FTP_BINARY);
array_push($ziparray, array( PCLZIP_ATT_FILE_NAME => "$tmpname", PCLZIP_ATT_FILE_NEW_FULL_NAME => "$new_name"));
}
}
return $ziparray;
}