Автор Тема: Рекурсивный ftp_rawlist, а так же обрыв соединения  (Прочитано 3436 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн X-Disa

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 36
  • +0/-0
  • 0
    • Просмотр профиля
Пишу систему индексации фтп серверов. В общем-то все хорошо, сканит и работает достаточно быстро.

Однако столкнулся с парой проблем.

Система работает двумя способами. После соединения с сервером, скрипт пробует рекурсивный запрос:

ftp_rawlist($ident,$dir,true);

Если результата нет, то делает обычный ftp_rawlist (и далее ходит по папкам).

В случае с рекурсивным запросом такая трабла — результат не всегда содержит полный листинг. Можно ли это как-то отследить? И в чем может быть проблема?

Далее, если используется обычный метод сканирования.

Результат от ftp_rawlist обрабатывается в цикле, и если там папка, ее содержимое опять же запрашивается через ftp_rawlist.

Проблема 1. Срабатывает не на всех папках. Частично решение найдено, если нет результата, используется ftp_nlist. Однако, в некоторых случаях, результата все равно нет. С чем это может быть связано?

Проблема 2. Некоторые серверы (при обычном сканировании) периодически просто рвут соединение. Опять же, частичное решение в виде: если !ftp_chdir($link,"/"), то сделать реконнект и продолжить сканирование помогает не всегда.

Проблема 3. Иногда уходит в бесконечный цикл, путь при этом выглядит так: сервер/папка/папка/папка/папка... Решение в виде провеки существования папки по этому пути помогло, однако, хотелось бы знать причину.

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
Рекурсивный ftp_rawlist, а так же обрыв соединения
« Ответ #1 : 11 Апреля 2007, 14:13:21 »
Предположил бы, что ты не проверяешь папки: \'.\' и \'..\' тоесть если посмотришь список то будут всегда содержатся две эти папки. от этого возможно зацикливание или сервера рвут соединение.
Не все является тем чем кажется.

Оффлайн fallcom

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Рекурсивный ftp_rawlist, а так же обрыв соединения
« Ответ #2 : 12 Апреля 2007, 00:27:14 »
Цитировать
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;
}

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28