Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сканер FTP (продолжение)
 
 автор: mtxd   (09.05.2006 в 19:06)   письмо автору
 
 

Была ужа такая тема, и даже пример... но есть две проблемы. В старую тему невозможно написать, посему решил создать новую.
Вторая проблема заключалась в том, что предоставленный сканер не переходил по "сложным каталогам", тоесть по тем, в названиях которых есть спец. символы, например [ ]. Написав автору темы, ответа не долждался, поэтому решил внести изменения сам. Итак:

<?php
require_once("config.inc.php");
$root "/pub/VIDEO/";
scanftp($link$root);
ftp_close($link);

echo 
"<pre>";
print_r($file);
echo 
"</pre>";

function 
scanftp($link$root)
{
    GLOBAL 
$file;

//        $dir_list = ftp_rawlist($link, $root);

        
ftp_chdir($link$root.$directory);
        
$dir_list ftp_rawlist($link".");

    foreach (
$dir_list as $path) {
        
$output explode(":"$path);
        
$left $output[0];
          
$directory substr($output[1], 3);
              
          if (
substr($directory01) == '.') continue;
          if (
substr($left01) == 'd') {
              
scanftp($link$root.$directory."/");
          }
          
          if(
substr($left01) == '-') {
              if(
substr($directory, -3) == 'avi') {
                  
$file[] = $directory." #-# ".$root.$directory;
              }
          }
      }
}
?>

(конфиг как и в прошлом примере по адресу: http://www.softtime.ru/scripts/ftpscaner.php)

Данный пример сканирует рекурсивно каталог /pub/VIDEO на одном из серверов. Внутри ещё 2-3 уровня, вроде все хорошо. Тем не менее при попытке сканировать из корня, а именно /pub/, скрипт высыпает ошибками, что странно...

Warning: Invalid argument supplied for foreach() in /home/www/filmdb/ftp/index2.php on line 20

Warning: ftp_chdir(): PORT command successful in /home/www/filmdb/ftp/index2.php on line 17

Warning: Invalid argument supplied for foreach() in /home/www/filmdb/ftp/index2.php on line 20

Warning: ftp_chdir(): POSLE not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: Invalid argument supplied for foreach() in /home/www/filmdb/ftp/index2.php on line 20

Warning: ftp_chdir(): OSLE not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): E not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: Invalid argument supplied for foreach() in /home/www/filmdb/ftp/index2.php on line 20

Warning: ftp_chdir(): Invalid command: try being more creative in /home/www/filmdb/ftp/index2.php on line 17

и далее по списку... причем видно, что коверкует команду PORT подставляя куски, похоже, из названий папок, и вызывая при этом ошибку цикла.

И ещё одно, пробовал сканировать директорию с большим количеством видео файлов (около 500). Сначала ругался на лимит памяти, поднял до 128, но результат работы скрипта - пустая страница. Ладно, думаю, попробовал просканировать папку с музыкой. Результат - более 2000 удачных вхождений и принт полного массива...
Если кому интересно, давайте разберемся вместе :)

   
 
 автор: cheops   (10.05.2006 в 13:38)   письмо автору
 
   для: mtxd   (09.05.2006 в 19:06)
 

Давайте разбираться... для начала поместить перед циклом foreach проверку, на пустоту массива
<?php
  
if(!empty($dir_list))
  foreach (
$dir_list as $path) {
?>

Это должно исключить возникающие ошибки, когда циклу передаётся пустой массив.

   
 
 автор: mtxd   (10.05.2006 в 14:12)   письмо автору
 
   для: cheops   (10.05.2006 в 13:38)
 

Вся сложность, как всегда, в простоте :)
Данный вариант, конечно, убирает ошибку цикла, однако все что связано с chdir - остается.
Warning: ftp_chdir(): PORT command successful in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): POSLE not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): OSLE not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): PORT command successful in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): PORT command successful in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): E not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): Invalid command: try being more creative in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): POLUNUCHI/ not understood in /home/www/filmdb/ftp/index2.php on line 17

Warning: ftp_chdir(): OLUNUCHI/ not understood in /home/www/filmdb/ftp/index2.php on line 17


Очень странно, так как в моем случае директория /pub/VIDEO/ сканируется безо всяких проблем, рекусивно. Как только выходим выше, на /pub/, начинаются проблемы. Имена папок нормальные.

   
 
 автор: cheops   (10.05.2006 в 14:19)   письмо автору
 
   для: mtxd   (10.05.2006 в 14:12)
 

Вот что не понятно, откуда берётся переменная $directory в функции?
<?php
ftp_chdir
($link$root.$directory);
?>

   
 
 автор: mtxd   (10.05.2006 в 14:29)   письмо автору
 
   для: cheops   (10.05.2006 в 14:19)
 

При первом входе в цикл переменная $directory не равна ничему, поэтому проверяем корень ($root). Потом в нее заносятся данные из

<?
$output 
explode(":"$path);
$left $output[0];
$directory substr($output[1], 3);
?>

   
 
 автор: mtxd   (11.05.2006 в 14:12)   письмо автору
 
   для: mtxd   (10.05.2006 в 14:29)
 

Вопрос остается актуальным... или только для меня? Жду поддержки :)

   
 
 автор: cheops   (11.05.2006 в 23:26)   письмо автору
 
   для: mtxd   (11.05.2006 в 14:12)
 

Любопытная фраза "Warning: ftp_chdir(): POSLE not understood" - вы не знаете с каким типом FTP-сервера вы соединяетесь, почему он не понимает этой команды FTP-протокола?

   
 
 автор: mtxd   (11.05.2006 в 23:59)   письмо автору
 
   для: cheops   (11.05.2006 в 23:26)
 

/pub/VIDEO/ сканируется на базе proftpd 1.3.0. Результат - все в порядке (180 элементов массива).
/pub/ на том же сервере выдает эти ошибки, причем видно что POSLE, POLUNUCHI и CHI иногда заменяют сервисную PORT (кстати, других изменений нет).
При сканирование другого ресурса со структурой папок как /pub/VIDEO - результат пустая страница, сервер на vsftpd(версию сейчас не вспомню, если критично - посмотрю). Примерных элементов массива должно быть 500-600. Ругался на нехватку памяти, но поднял лимит.
А команду не понимает потому что такой просто нет в протоколе FTP.

   
 
 автор: mtxd   (15.05.2006 в 12:49)   письмо автору
 
   для: mtxd   (11.05.2006 в 23:59)
 

Уважаемые, больше никаких предположений не будет? Очень нужна полностью рабочая версия, а собственные идеи уже закончились :(

   
 
 автор: XPraptor   (15.05.2006 в 13:00)   письмо автору
 
   для: mtxd   (15.05.2006 в 12:49)
 

Идея очень и очень простая. На официальном сайте php.net в разделе документация, при описании функций работы с FTP внизу всегда пользовательские примеры. Там полностью есть готовые универсальные коды для любого типа FTP. Идешь, читаешь, радуешься и не паришь товарищей и себя :-))

   
 
 автор: mtxd   (16.05.2006 в 11:05)   письмо автору
 
   для: XPraptor   (15.05.2006 в 13:00)
 

Было бы все так просто как ты пишешь, не стал бы задавать вопросов. Те примеры либо несколько другого направления (аплод, миграция), либо тоже такие же простые как и скрипт оригинала, который я переделывал. Я даже готов отказаться от PHP и сделать это все на другом языке (perl, например), но во-первых я его не знаю, во-вторых пока не нашел готового решения :(
А цель такова - загнать информацию о файлах в базу для дальнейшей обработки.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования