Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak NAJLEPIEJ pobierać zdjęcia z innych serwerów.
Forum PHP.pl > Forum > PHP
starcode
Witam!

Obecnie stoję przed problemem / zadniem pobierania dużej (a w sumie to bardzo dużej) ilości danych - mianowicie plików graficznych z innych serwerów.

Potrzebują zrealizować pobieranie zdjęć produktów z innych serwisów. Są to setki tysięcy plików graficznych do pobrania - oczywiście nie muszę ich pobrać hurtem wszystkich naraz. Pobieranie tych zdjęć to raczej nieskończony proces (starsze są usuwane, dodawane kolejne) - więc nigdy nie będzie tak, że wszystkie pliki będą pobrane.
Powiedzmy, że pliki będą pobierane w kolejności jakiejś tam (np. popularności).

Przechodzę do sedna sprawy. Mam adresy URL do owych plików graficznych. Dylemat przed, którym stoję to sposób pobierania plików. Dwie opcje jakie rozważam to funkcja PHP
oraz
  1. cURL
. W obu przypadkach po pobraniu pliku lokalnie - obrabiam i przetwarzam sobie plik.

Pytanie, która z opcji będzie bardziej wydajna? Może jest jakaś inna alternatywa?
Jest jakiś sposób, aby "nie zamulać serwera" - chodzi mi tutaj o czas oczekiwania na plik z serwera zewnętrznego.

Założyłem też rozwiązanie - aby pobierać pliki graficzne w momencie gdy są potrzebne - tj. użytkownik odwiedza stronę, na której są odnośniki do plików graficznych i dopiero wówczas są pobierane - jednakże generowanie takiej strony (za pierwszym razem) jest wówczas dość długie.
Drugim rozwiązaniem jest pobieranie zdjęć jako "robot".

Czekam na Wasze komentarze, propozycje.
wookieb
curl_multi_init. Tylko asynchronicznie.
erix
Cytat
Drugim rozwiązaniem jest pobieranie zdjęć jako "robot".

A ja bym generował listę URL-i i odpalał
Kod
wget -i urls.txt

IMO wget się trochę lepiej do tego nadaje. [;
starcode
Wget jest rozwiązaniem, które wdrożyłem.

Pytanie tylko jest takie, czy w pliku z którego ma być pobierana lista URL'i można podać w jakiś sposób adres (nazwę docelową) pliku.

Przykładowo, mam w pliku adresy:
http://www.domena.pl/katalog1/1.jpg
http://www.domena.pl/katalog2/1.jpg
http://www.domena.pl/katalog3/1.jpg
http://www.domena.pl/katalog4/1.jpg

mimo, że wszystkie pliki są plikami różnymi zostaną zapisane jako pliki
1.jpg
1.jpg.1
1.jpg.2
1.jpg.3

Czy możliwe jest podanie np. nazwy docelowej w takim pliku:
przykładowo:
http://www.domena.pl/katalog1/1.jpg -o 1.jpg
http://www.domena.pl/katalog1/1.jpg -o 2.jpg

Ktoś ma jakieś doświadczenie w tym polu?
Crozin
Zacznijmy od tego, że obie metody jakie podałeś, jak i metoda podana przez @erixa robią dokładnie to samo, tj. łączą się ze zdalnym serwerem i wykorzystując protokół HTTP pobierają z niego dane. Innymi słowy to wszystko to w rzeczywistości to samo - jedynie ubrane w inne API.

Utwórz sobie na zdalnym serwerze program / skrypt, który zbuduje jakieś archiwum TAR, ZIP czy jeszcze inne zawierające wszystkie potrzebne dane, tj. przykładowo listę wszystkich obrazów dodanych / usuniętych od czasu ostatniego żądania oraz same pliki graficzne. Później musisz już tylko takie archiwum pobrać, rozpakować i przetworzyć. Oszczędzisz sobie setek bezsensownych żądań HTTP.
starcode
Cytat(Crozin @ 5.07.2011, 23:22:14 ) *
Zacznijmy od tego, że obie metody jakie podałeś, jak i metoda podana przez @erixa robią dokładnie to samo, tj. łączą się ze zdalnym serwerem i wykorzystując protokół HTTP pobierają z niego dane. Innymi słowy to wszystko to w rzeczywistości to samo - jedynie ubrane w inne API.

Utwórz sobie na zdalnym serwerze program / skrypt, który zbuduje jakieś archiwum TAR, ZIP czy jeszcze inne zawierające wszystkie potrzebne dane, tj. przykładowo listę wszystkich obrazów dodanych / usuniętych od czasu ostatniego żądania oraz same pliki graficzne. Później musisz już tylko takie archiwum pobrać, rozpakować i przetworzyć. Oszczędzisz sobie setek bezsensownych żądań HTTP.


Dzięki za odpowiedź. Jednakże nie mogę tego tak zrobić. Ponieważ nie z jednego serwera pobieram dane, a z kilku tysięcy różnych serwerów. Przedstawione rozwiązanie miałoby sens, gdybym pobierał pliki z jednego serwera i/lub z serwera do którego mam "dostęp" - tj. mam możliwość uruchomienia tam jakiś skryptów - a takiej możliwości nie mam.

Odświeżam pytane odnośnie wget - zmian nazw pobieranych plików.

by_ikar
Z tego co pamiętam manuala wget, nie ma on możliwości zmiany nazwy pliku który pobierasz. A zwłaszcza jak pobierasz wiele plików np poprzez wskazanie url do katalogu i pobieranie plików/katalogów rekurencyjnie. Nie mniej, opcja z jakimś prefixem byłaby całkiem fajna.
gcdreak
Możesz uruchomić w Bashu skrypt z pętlą, a w każdym jej przebiegu będziesz pobierał coś z serwera i wtedy użyjesz opcji -o nazwa
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.