Forum Webscript.Ru

Программирование => PHP => Тема начата: X-Disa от 09 Апреля 2007, 01:06:18

Название: Рекурсивный ftp_rawlist, а так же обрыв соединения
Отправлено: 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. Иногда уходит в бесконечный цикл, путь при этом выглядит так: сервер/папка/папка/папка/папка... Решение в виде провеки существования папки по этому пути помогло, однако, хотелось бы знать причину.
Название: Рекурсивный ftp_rawlist, а так же обрыв соединения
Отправлено: Altaxar от 11 Апреля 2007, 14:13:21
Предположил бы, что ты не проверяешь папки: \'.\' и \'..\' тоесть если посмотришь список то будут всегда содержатся две эти папки. от этого возможно зацикливание или сервера рвут соединение.
Название: Рекурсивный ftp_rawlist, а так же обрыв соединения
Отправлено: fallcom от 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;
}