Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: проверка наличия файла по ссылке на ftp
Задача проверить наличие файла на фтп и записать результат проверки.
Для каждой из записи делаю parse_url, получаю записи вида
$a[host] = 192.168.5.1
$a[path] = /film/file1.avi
Для себя решил использовать ftp_connect() -> ftp_login() -> ftp_size() -> ftp_close() и по результатам записываю 3 флага.
не соединился с ftp - 1
соединился, не залогинился - 1
соединился, не получил размер файла - 2
соединился, получил размер файла - 3
Сначала написал простой цикл прохождения ftp_connect()->ftp_login()->ftp_size()->ftp_close() для каждой записи. Т.е. для каждой записи открывал отдельное соединение, затем закрывал.
Но есть специфичные фтп, для которых ограничено количество последовательных connect/disconnect за единицу времени, после чего происходит - бан. Это логично, это правильно.
Поэтому предполагаю, что надо как то сгруппировать записи по одинаковому ftp, сделать 1 connect, затем в этом connect перебрать все path, проверяя наличие файлов на этом фтп. Затем закрыть соединение и перейти к другому серверу.
Не могу осилить написание цикла. Наставьте на путь истинный..
evgenijj
Отправлено: 28 Января, 2011 - 22:38:38
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А что мешает проверять наличие файла в рамках одного соединения с сервером?
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
SHT
Отправлено: 29 Января, 2011 - 01:02:16
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011
Помог: 0 раз(а)
EuGen пишет:
А что мешает проверять наличие файла в рамках одного соединения с сервером?
Собственно в этом и состоит задача. Нужно сделать коннект, например к 192.168.3.1 и сделать в цикле проверку ftp_size() файлов, которые на нем. Как только наличие последнего файла проверили (получили size) - закрываем соединение и переходим к другому серверу.
Наверное нужно что-то типа:
Т.е. как бы сравнивать: если значение хоста равно значению хоста в предыдущем цикле, значит не надо заходить заново на фтп, а просто проходим по файлам. А если не равно, т.е. следующая запись - уже другой фтп, то надо close и заходить на этот(новый) фтп и проходить по нему ftp_size().
Только if($host ="..") надо перед ftp_connect что-ли делать?.. Запуталсо в общем...
evgenijj
Отправлено: 29 Января, 2011 - 01:26:52
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Так цикл в цикле. Первый - пробегает по всем серверам. Второй-вложенный - начинается только в случае, если удалось соединиться с сервером, который обрабатывается текущей итерацией первого цикла. Во втором идет цикл по файлам.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
evgenijj
Отправлено: 29 Января, 2011 - 01:38:11
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Самый тупой вариант -- просматривать все. Просто с задержкой, sleep(5), чтобы нас не заподозрили в чем-то недобром. Сложнее -- найти одинаковые сервера (типа http://abc.ru) и попытаться оптимизировать процесс. Чтобы не создавать лишнюю нагрузку на внешние сервера. В общем, давай список ссылок, чтобы можно было понять, как его оптимизировать, а мы будем думать...
В цикле while ($s = mysql_fetch_array($r)) , я для каждой записи повторяю полный цикл - зашел, залогинился, проверил файл, вышел. А хотелось бы не выходить, а зайти один раз на ftp 3.1 и проверить наличие файлов - file1.avi, file2.avi.. Потом сделать ftp_close() и перейти к другому ftp.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
SHT, а в чём, собственно, затруднение? Открываете коннект к первому серверу и в цикл. А в цикле в самом начале условие - если текущий сервер не предыдущий, то закрыть коннект и открыть новый.
Работать будет эффективно, т.к. база отсортирует по порядку.
----- PostgreSQL DBA
SHT
Отправлено: 29 Января, 2011 - 10:55:50
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011
Помог: 0 раз(а)
Цитата:
если текущий сервер не предыдущий
Собственно загвоздка в этом была.... Наверное, надо в конце цикла вместо ftp_close() присвоить какой-нить переменной, например $a=$host.
А в начале цикла (после ftp_connect):
только получается, что в уже открытом соединении будет еще раз делаться ftp_login().. ниче?
зы: по-любому "утро вечера мудренее"
JustUserR
Отправлено: 29 Января, 2011 - 22:44:37
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
SHT пишет:
Т.е. как бы сравнивать: если значение хоста равно значению хоста в предыдущем цикле, значит не надо заходить заново на фтп, а просто проходим по файлам
В качестве эффективного варианта алгоритма осуществления создания PHP-приложения с реализацией предоставленной схемы - целесообразно обеспечить предварительное группирование проверяемых файловых объектов на основании информационного поля их сетевого адреса - в случае использования в решения значительного количества добавляемых ресурсов для осуществления их последующей проверки и использовании незначительного количества различных FTP-серверов обеспечивающих хранение данных - то возможно достижение эффективного варианта решения связанного с осуществления плановых операций проверки для каждого FTP-сервера в отдельности
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
SHT
Отправлено: 25 Февраля, 2011 - 17:15:16
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011
Помог: 0 раз(а)
JustUserR, огромное спасибо. Так и собирался делать - группировкой.
На данный момент реализовано с помощью многомерного ассоциативного массива:
$insert=mysql_query("UPDATE films.film SET state='0' WHERE film.link like '%".$value."%'");
}
}
?>
JustUserR
Отправлено: 25 Февраля, 2011 - 22:59:16
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
SHT пишет:
JustUserR, огромное спасибо. Так и собирался делать - группировкой.
На данный момент реализовано с помощью многомерного ассоциативного массива
Пожалуйста! Использование предполагаемой схемы решения является оптимальным вариантом реализации общего класса задач, включающих проведение быстродействующих локальных вычислительных операций и ресурсоемких удаленных действий; в частности использование указанного принципа осуществления при генерации оптимальных SQL-запросов, с целью обеспечения создания минимального количества раздельных соединений с целевым сервером СУБД
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.