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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
SHT
Отправлено: 28 Января, 2011 - 22:26:51
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Всем добрый вечер.

Есть выборка из таблицы, отсортированная по link, вида:

id link
113 ftp://192[dot]168[dot]3[dot]1/file1[dot]avi
112 ftp://192[dot]168[dot]3[dot]1/file2[dot]avi
114 ftp://192[dot]168[dot]3[dot]1/file3[dot]avi
116 ftp://192[dot]168[dot]5[dot]1/film/file1[dot]avi
115 ftp://192[dot]168[dot]5[dot]1/film/file1[dot]avi

Задача проверить наличие файла на фтп и записать результат проверки.
Для каждой из записи делаю 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, проверяя наличие файлов на этом фтп. Затем закрыть соединение и перейти к другому серверу.

Не могу осилить написание цикла. Наставьте на путь истинный..
 
 Top
evgenijj
Отправлено: 28 Января, 2011 - 22:38:38
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




1. Отдохни, "Сникерсни" -- sleep(3);
2. Анонимный прокси
 
 Top
SHT
Отправлено: 28 Января, 2011 - 23:09:05
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




спасибо, попробую sleep

хотя, если будет хотя бы 200 записей на 1 фтп - это уже 10мин на этот фтп..

(Отредактировано автором: 28 Января, 2011 - 23:20:59)

 
 Top
EuGen Администратор
Отправлено: 29 Января, 2011 - 00:27:08
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




А что мешает проверять наличие файла в рамках одного соединения с сервером?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
SHT
Отправлено: 29 Января, 2011 - 01:02:16
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




EuGen пишет:
А что мешает проверять наличие файла в рамках одного соединения с сервером?

Собственно в этом и состоит задача. Нужно сделать коннект, например к 192.168.3.1 и сделать в цикле проверку ftp_size() файлов, которые на нем. Как только наличие последнего файла проверили (получили size) - закрываем соединение и переходим к другому серверу.
Наверное нужно что-то типа:
CODE (htmlphp):
скопировать код в буфер обмена
  1. while ($xxx = mysql_fetch_array($yyy))
  2. {
  3.    $info = parse_url($xxx[link]);
  4.    $host = $info['host'];
  5.    $file = $info['file'];
  6.    ftp_connect($host);
  7.    ftp_login();
  8.    ftp_size(..$file);
  9.  
  10.    if ($host="значению хоста в прошлом цикле")
  11.    {
  12.      ftp_size(...,$file);
  13.    }
  14.    else
  15.    {
  16.      ftp_close();
  17.    }
  18. }


Т.е. как бы сравнивать: если значение хоста равно значению хоста в предыдущем цикле, значит не надо заходить заново на фтп, а просто проходим по файлам. А если не равно, т.е. следующая запись - уже другой фтп, то надо close и заходить на этот(новый) фтп и проходить по нему ftp_size().
Только if($host ="..") надо перед ftp_connect что-ли делать?.. Запуталсо в общем...
 
 Top
evgenijj
Отправлено: 29 Января, 2011 - 01:26:52
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




SHT пишет:
if ($host="значению хоста в прошлом цикле")
???
Может быть ==?
 
 Top
EuGen Администратор
Отправлено: 29 Января, 2011 - 01:28:47
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Так цикл в цикле. Первый - пробегает по всем серверам. Второй-вложенный - начинается только в случае, если удалось соединиться с сервером, который обрабатывается текущей итерацией первого цикла. Во втором идет цикл по файлам.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
evgenijj
Отправлено: 29 Января, 2011 - 01:38:11
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Самый тупой вариант -- просматривать все. Просто с задержкой, sleep(5), чтобы нас не заподозрили в чем-то недобром. Сложнее -- найти одинаковые сервера (типа http://abc.ru) и попытаться оптимизировать процесс. Чтобы не создавать лишнюю нагрузку на внешние сервера. В общем, давай список ссылок, чтобы можно было понять, как его оптимизировать, а мы будем думать...
 
 Top
SHT
Отправлено: 29 Января, 2011 - 01:50:48
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Я наверное фигово объясняю просто.
Есть локалка с левыми адресами. Есть энтузиасты, держащие на своих ftp фильмы.
Я сделал каталог этих фильмов. Теперь необходимо проверять наличие файла на ftp (его могут удалить, юзер может выключить фтп) и в зависимости от этого либо давать ссылку на скачивание, либо делать ссылку неактивной.
Есть код, который выполняет для каждого элемента массива ftp_connect->ftp_size->ftp_close.
Массив, что-то типа:
id link
113 ftp://192[dot]168[dot]3[dot]1/file1[dot]avi
112 ftp://192[dot]168[dot]3[dot]1/file2[dot]avi
114 ftp://192[dot]168[dot]3[dot]1/file3[dot]avi
116 ftp://192[dot]168[dot]5[dot]1/film/file1[dot]avi
115 ftp://192[dot]168[dot]5[dot]1/film/file1[dot]avi
.... ftp://xxx.yy.zz.iii/../...

Т.к. в каждой строке этого массива ftp чаще всего повторяются, как следствие - скрипт "задрючивает" фтп.

Код.
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $db = mysql_connect("localhost", "", "");
  3.    if (!$db)
  4.    {
  5.        echo "no connect";
  6.        exit;
  7.    }
  8. $r = mysql_query("SELECT film_id,link from film order by link");
  9.    if (!$r)
  10.    {
  11.        echo "нет результата";
  12.        exit;
  13.    }
  14. while ($s = mysql_fetch_array($r))
  15.    {
  16.        # парсим ftp-ссылку в массив
  17.        $info = parse_url("$s[link]");
  18.        $host = $info['host'];
  19.        $connect = ftp_connect($host,21,5);
  20.        if(!$connect)
  21.           {
  22.                $insert = mysql_query('UPDATE films.film SET state="0" WHERE film.film_id="'.$s['film_id'].'"');
  23.            }
  24.        else
  25.            {
  26.                #echo "соединение прошло успешно"."<br>";
  27.                if ($host="ftp.xxx.ru") // есть фтп у которого логин не anonymous
  28.                {
  29.                    $user = "ftp";
  30.                    $password = "ftp";
  31.                }
  32.                else
  33.                {
  34.                    $user = "anonymous";
  35.                    $password = "";
  36.                }
  37.                $result = ftp_login($connect, $user, $password);
  38.                    if(!$result)
  39.                    {
  40.                        echo "<td>"."не залогинились"."</td></tr>";
  41.                        $insert = mysql_query('UPDATE films.film SET state="0" WHERE film.film_id="'.$s['film_id'].'"');
  42.                    }
  43.  
  44.                $file = $info['path'];
  45.                $file_size = ftp_size($connect, $file);
  46.                if ($file_size == -1)
  47.                    {
  48.                        $insert = mysql_query('UPDATE films.film SET state="1" WHERE film.film_id="'.$s['film_id'].'"');
  49.                    }
  50.                else
  51.                    {
  52.                        $insert = mysql_query('UPDATE films.film SET state="2" WHERE film.film_id="'.$s['film_id'].'"');
  53.                    }
  54.            ftp_close($connect);
  55.            }
  56.    }
  57.  
  58. ?>



В цикле while ($s = mysql_fetch_array($r)) , я для каждой записи повторяю полный цикл - зашел, залогинился, проверил файл, вышел. А хотелось бы не выходить, а зайти один раз на ftp 3.1 и проверить наличие файлов - file1.avi, file2.avi.. Потом сделать ftp_close() и перейти к другому ftp.

(Отредактировано автором: 29 Января, 2011 - 01:53:43)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Января, 2011 - 08:57:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




SHT, а в чём, собственно, затруднение? Открываете коннект к первому серверу и в цикл. А в цикле в самом начале условие - если текущий сервер не предыдущий, то закрыть коннект и открыть новый.
Работать будет эффективно, т.к. база отсортирует по порядку.


-----
PostgreSQL DBA
 
 Top
SHT
Отправлено: 29 Января, 2011 - 10:55:50
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Цитата:
если текущий сервер не предыдущий

Собственно загвоздка в этом была.... Наверное, надо в конце цикла вместо ftp_close() присвоить какой-нить переменной, например $a=$host.
А в начале цикла (после ftp_connect):


только получается, что в уже открытом соединении будет еще раз делаться ftp_login().. ниче?

зы: по-любому "утро вечера мудренее"
 
 Top
JustUserR
Отправлено: 29 Января, 2011 - 22:44:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




SHT пишет:
Т.е. как бы сравнивать: если значение хоста равно значению хоста в предыдущем цикле, значит не надо заходить заново на фтп, а просто проходим по файлам
В качестве эффективного варианта алгоритма осуществления создания PHP-приложения с реализацией предоставленной схемы - целесообразно обеспечить предварительное группирование проверяемых файловых объектов на основании информационного поля их сетевого адреса - в случае использования в решения значительного количества добавляемых ресурсов для осуществления их последующей проверки и использовании незначительного количества различных FTP-серверов обеспечивающих хранение данных - то возможно достижение эффективного варианта решения связанного с осуществления плановых операций проверки для каждого FTP-сервера в отдельности


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
SHT
Отправлено: 25 Февраля, 2011 - 17:15:16
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




JustUserR, огромное спасибо. Так и собирался делать - группировкой.

На данный момент реализовано с помощью многомерного ассоциативного массива:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. #получаем ссылку на фильм
  3. $db = mysql_connect("localhost", "fig", "vam");
  4.    if (!$db)
  5.    {
  6.        echo "no connect";
  7.        exit;
  8.    }
  9. $r = mysql_query("SELECT film_id,link from film order by link");
  10.    if (!$r)
  11.    {
  12.        echo "no mysql result";
  13.        exit;
  14.    }
  15. #Заводим ассоциативный массив групп
  16. #Обходим все файлы и рассовываем их по группам, сортируя по ftp
  17. $ftps = array();
  18. while ($k = mysql_fetch_array($r,MYSQL_ASSOC))
  19.    {
  20.        $s = $k['film_id'];
  21.        #########################################################
  22.        #Скрипт проверки наличия файла по указанной ссылке
  23.        #########################################################
  24.        # парсим ftp-ссылку в масив
  25.        $info = parse_url("$k[link]");
  26.        ##############################
  27.        $host = $info['host'];
  28.        $file = $info['path'];
  29.        if(!isset ($ftps[$host]))
  30.        $ftps[$host] = array();
  31.        $ftps[$host][] = $file;
  32.    }
  33. foreach ($ftps as $host => $files)
  34.    {
  35.        if ($connect = ftp_connect($host,21,5))
  36.        {
  37.            $user = "anonymous";
  38.            $password = "";
  39.            $result = ftp_login($connect, $user, $password);
  40.            if(!$result)
  41.            {
  42.                $insert = mysql_query("UPDATE films.film SET state='0' WHERE film.link like '%".$value."%'");
  43.            }
  44.            foreach ($files as $key=>$value)
  45.            {
  46.                $file_size = ftp_size($connect, $value);
  47.                if ($file_size == -1) #если не получили размер файла
  48.                {
  49.                    $insert = mysql_query("UPDATE films.film SET state='1' WHERE film.link like '%".$value."%'");
  50.                }
  51.                else #если получили размер файла
  52.                {
  53.                    $insert = mysql_query("UPDATE films.film SET state='2' WHERE film.link like '%".$value."%'");
  54.                }
  55.            }
  56.            ftp_close($connect);
  57.        }
  58.        else #если не соединились с ftp
  59.        {
  60.            $insert = mysql_query("UPDATE films.film SET state='0' WHERE film.link like '%".$value."%'");
  61.        }
  62.    }
  63.  
  64. ?>
 
 Top
JustUserR
Отправлено: 25 Февраля, 2011 - 22:59:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




SHT пишет:
JustUserR, огромное спасибо. Так и собирался делать - группировкой.
На данный момент реализовано с помощью многомерного ассоциативного массива
Пожалуйста! Использование предполагаемой схемы решения является оптимальным вариантом реализации общего класса задач, включающих проведение быстродействующих локальных вычислительных операций и ресурсоемких удаленных действий; в частности использование указанного принципа осуществления при генерации оптимальных SQL-запросов, с целью обеспечения создания минимального количества раздельных соединений с целевым сервером СУБД


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB