Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: szybkość a generowanie miniatur...

na marginesie - proponuję robić miniaturki jako jpegi progresywne - mniejsze, szybciej się ładują a efekt ten sam (przy małej fotce efekt progresywnego ładowania będzie raczej nie widoczny). Tak ma to rozwiązane picasa web albums (zmiana wielkości miniaturek) i działa to całkiem sympatycznie.
Jakub L.

Jakub L. Programista

Temat: szybkość a generowanie miniatur...

Marcin Bachleda:

Ok, ale co gdy miniaturki nie sa proporcjonalne ?
>
Znajac grafika pewnie takie zrobil, wiec beda wygladac, hmm - kiepsko.

Ano kiepsko :) albo css - widziałem w Travianie cssa który przesuwa obrazki tak, że widać ich tylko drobny kawałeczek - przeskalować do zadanej rozdzielczości, a potem pokazać odpowiedni kawałeczek przy pomocy cssa, niech no znajdę: background-imgage, height, width z tej nieproporcjonalnej miniaturki i background-position, tylko nie wiem jak to zadziała skombowane z height i width obrazka jakby go przeglądarka jeszcze przeskalowywała z większego. Pewnie wcale.
Agnieszka Zielinska

Agnieszka Zielinska Account Executive

Temat: szybkość a generowanie miniatur...

hmmmm zdecydowanie najszybsze rozwiazanie to generowanie miniaturek przy uploadzie i serwowanie tego bez posrednictwa PHP. niemniej jednak to rozwiazanie ma ograniczona elastycznosc - co jesli w pewnym momencie zycia serwisu (nowa szata graficzna) zmienia sie wymiary miniatur? trzeba bedzie kombinowac.

zdecydowanie bardziej elastyczne jest generowanie "w locie" - przy czym warto polaczyc to z jakims prostym mechanizmem cache - aby generowanie odbywalo sie tylko przy 1 requescie a kolejne to po prostu serwowanie wygenerowanego pliku tymczasowego (z cache).
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: szybkość a generowanie miniatur...

Agnieszka Zielinska:
hmmmm zdecydowanie najszybsze rozwiazanie to generowanie miniaturek przy uploadzie i serwowanie tego bez posrednictwa PHP. niemniej jednak to rozwiazanie ma ograniczona elastycznosc - co jesli w pewnym momencie zycia serwisu (nowa szata graficzna) zmienia sie wymiary miniatur? trzeba bedzie kombinowac.

trzymasz orginaly fotek, wylaczasz produkcyjna instalacje, zapuszczasz przeskalowanie zdjec np: w cli + ewnetualnie jakas migracja bazy,
zdecydowanie bardziej elastyczne jest generowanie "w locie" - przy czym warto polaczyc to z jakims prostym mechanizmem cache - aby generowanie odbywalo sie tylko przy 1 requescie a kolejne to po prostu serwowanie wygenerowanego pliku tymczasowego (z cache).

ale troche kodu jest do napisania zeby to wyDRYowac i pozniej kiepsko to widze do uzywania w widokach :S
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: szybkość a generowanie miniatur...

@Agnieszko, jest jeszcze możliwość połączenia tych dwóch technik i ograniczyć udział PHP (bo przecież o to chodzi tak naprawdę) tylko do tego 1-wszego żądania.

Będzie potrzebny do tego mod_rewrite (lub odpowiednik dla używanego serwera) i ustalenie pewnej konwencji nazewnictwa (lub struktury folderów).
1.Co do, wspomnianej wcześniej, konwencji to nazwy plików mogą wyglądać mniej więcej tak: #hash-zdjecia#-#typ-zdjecia#.#rozszerzenie# , gdzie #hash# to jakiś identyfikator oryginalnego zdjęcia (Należy pamiętać, aby nie był to klucz główny z bazy. Zapobiegnie to, zbyt prostemu, masowemu pobieraniu fotek przez boty); #typ-zdjecia# to rodzaj miniatury, którą chcesz pobrać np. medium, large, frontpage-gallery etc. (rozmiary miniatur dla każdego z typów można przechowywać w konfiguracji aplikacji); #rozszerzenie# to akceptowane przez serwis rozszerzenia plików graficznych.
2. Sens zastosowania mod_rewrite jest taki, żeby serwer przechwytując żądanie miniatury - nie znalazłszy pliku - kierował je do skryptu PHP (Reguły nie napiszę, ponieważ się na tym nie znam i nie potrafię z palca). Skrypt z kolei generuje plik z miniaturą na podstawie danych z nazwy pliku i wstawia go w miejsce żądania. Następnym razem serwer zaserwuje wygenerowany plik bez dodatkowych działań.

Tym sposobem udział PHP jest zmniejszony do minimum, a sam serwer nie będzie zbytnio obciążony, bo praktycznie robi to samo co wcześniej. Ewentualnie #typ-zdjecia# można przesunąć np. do nazwy folderu w którym się odpowiednie miniatury znajdują (im mniej plików w folderze tym szybciej serwer go przeszuka).

Rozwiązanie się nie sprawdzi jeżeli pliki trzymamy w jakiegoś rodzaju chmurze (Amazon S3?), bo i tak wtedy jakiekolwiek zmiany są utrudnione na maksa :)Alan Gabriel B. edytował(a) ten post dnia 26.08.09 o godzinie 08:54

konto usunięte

Temat: szybkość a generowanie miniatur...

Bartłomiej S.:
Lidia Wilczyńska:

U mnie jest to tak zrobione, że oryginalne zdjęcie jest ładowane do jednego katalogu. Potem np. gdy użytkownik po raz pierwszy wyświetli miniaturkę zdjęcia, to ta wygenerowana miniaturka ładowana jest do drugiego katalogu, a potem z niej pobierana.

U mnie działa tak samo. Jedyny minus, to spowolnienie pracy robotów pierwszego dnia po upload, ale jakoś tym się nie przejmuję :) Zresztą nawet one tylko czasami pobierają całe kopie stron...Piotr Likus edytował(a) ten post dnia 26.08.09 o godzinie 09:11
Agnieszka Zielinska

Agnieszka Zielinska Account Executive

Temat: szybkość a generowanie miniatur...

generalnie ja tez jestem zwolenniczka serwowania miniatur bez udzialu PHP. niestety jest to jeden z tych tematow, w ktorym trzeba dokonac wyboru miedzy jednym rozwiazaniem (bardziej elastycznym) a drugim (szybszym) - nie mozna niestety miec wszystkiego.
trzymasz orginaly fotek, wylaczasz produkcyjna instalacje, zapuszczasz przeskalowanie zdjec np: w cli + ewnetualnie jakas migracja bazy,

widzisz - tutaj musisz przemielic cala baze (nawet tych uzytkownikow, ktorzy np porzucili konta i dawno na nie sie nie loguja) i dodatkowo musisz przemielic wszystkie zdjecia

- w drugim sposobie po prostu zmieniasz np tylko parametr odpowiadajacy za rozmiar avatara i nowa grafika generowana jest tylko raz przy requescie :)
ale troche kodu jest do napisania zeby to wyDRYowac i pozniej kiepsko to widze do uzywania w widokach :S

a ja to w widoku wlasnie widze dosyc wyraznie - pisze helpera ktory kontruuje URLe do miniaturek (np takie jak zaproponowal Alan) :)
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: szybkość a generowanie miniatur...

Agnieszka Zielinska:
widzisz - tutaj musisz przemielic cala baze (nawet tych uzytkownikow, ktorzy np porzucili konta i dawno na nie sie nie loguja) i dodatkowo musisz przemielic wszystkie zdjecia

tak ale to jednorazowa i wyjatkowo prosta operacja, ktora moze sie odbywac w tle lub na zupelnie innej maszynie
- w drugim sposobie po prostu zmieniasz np tylko parametr odpowiadajacy za rozmiar avatara i nowa grafika generowana jest tylko raz przy requescie :)

gorzej jak do przeskalowania jest kilkanascie minaturek na request, a polaczen nagle masz kilkadziesiat w ciagu sekundy :S,
pozatym dochodzi kwestia nadmiarowosci kodu (trzeba sprawdzac cache itd), no i przy zbyt duzej liczbie polaczen bardzo prawdopodobne ze kilka procesow bedzie pisalo do jednego pliku a to nie takie banalne do wyeliminowania...
a ja to w widoku wlasnie widze dosyc wyraznie - pisze helpera ktory kontruuje URLe do miniaturek (np takie jak zaproponowal Alan) :)

no wlasnie ale trzeba to napisac, przetestowac, udokumentowac itd itd...
a migracje mozna zrobic w kilka linijek gimnazjalnego php, ba... mozna uzyc wydajniejszych rozwiazan niz gole php i nieszczesny libgd :P
Krzysztof Szatanik

Krzysztof Szatanik Starszy programista
PHP, Luxoft Poland

Temat: szybkość a generowanie miniatur...

Będzie potrzebny do tego mod_rewrite (lub odpowiednik dla używanego serwera) i ustalenie pewnej konwencji nazewnictwa (lub struktury folderów).

Ten sposób działa bardzo fajnie, zwłaszcza z użyciem lighttpd. Pliki wrzucane przez NFS na serwer z lighttpd pełniącym funkcję CDN. Troszkę inne parametry - nazwa_oryginalnego_pliku--width x height x typ_transformacji . rozszerzenie/format pliku (jpg|png|gif). Z racji na to że w lighttpd nie znalazłem odpowiednika RewriteCond %{SCRIPT_FILENAME} !-f skrypt zajmujący się ewentualnym skalowaniem jest ustawiony jako error-handler-404. Wsio działa szybko, sprawnie i wydajnie obsługując kilka serwisów o sumarycznie całkiem sporym natężeniu ruchu.
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: szybkość a generowanie miniatur...

Krzysztofie, ale czy wysokość i szerokość w nazwie pliku służą jako faktyczne parametry dla skryptu, czy tylko identyfikują z góry określone w configu wielkości?

Jeżeli tak, to odradzam. Bo Ci bota puszczą, który będzie generował tryliard rożnych rozmiarów do każdego znalezionego zdjęcia.
Krzysztof Szatanik

Krzysztof Szatanik Starszy programista
PHP, Luxoft Poland

Temat: szybkość a generowanie miniatur...

Rozmiary w nazwie służą jako faktyczne rozmiary oczekiwanej miniaturki ze względu na to że cdn jest wykorzystywany przez kilka serwisów i nie jestem w stanie z góry określić jakie rozmiary będą mi potrzebne. Jak dotąd nie miałem z tym żadnych problemów a przed ewentualnym niebezpieczeństwem strzeże mnie mod_evasive plus
$load = sys_getloadavg();
if ($load[0] > 10) {
header('HTTP/1.1 503 Too busy, try again later');
die('Server too busy. Please try again later.');
}

oraz powiadamianie SMS o przekroczonym obciążeniu serwera abym w razie czego mógł szybko sprawdzić co się dzieje i zareagować.

Tak więc ewentualne ryzyko jest niewielkie a korzyści z elastyczności całkiem spore.
Daniel Częstki

Daniel Częstki senior php developer

Temat: szybkość a generowanie miniatur...

dla mnie jedyne sensowne to utworzenie miniaturek po uploadzie zdjęcia na serwer, ale ktoś już o tym wspomniał :)
Edi Skraba

Edi Skraba Senior Project
Manager, Agencja
Reklamy Eura7

Temat: szybkość a generowanie miniatur...

Popieram metodę zaproponowaną przez Alana:
1. Tworzysz wszystkie miniaturki w trakcie upload (cache)
2. Na stronie identyczny mechanizm generalnie z tą różnicą, że jeżeli miniaturka jest już utworzona to ładuje ją z cache'a.

plusy rozwiązania:
- na pierwszy ogień miniaturki są generowane podczas wgrywania plików więc odciąża to userów od ich generowania
- nawet jeżeli dojdą inne rozmiary to skrypty na stronie wygenerują nam nowe miniaturki (elastyczność)

Jeżeli chodzi o "skomplikowanie" tego mechanizmu to nie widzę problemu, są frameworki które udostępniają rozwiązania (polecam Zend).

P.S.
Jeżeli z czasem pojawiło by się wgrywanie często dużej ilości plików przez admina to można ten mechanizm przenieść na CRONa (wtedy zarówno admin jak i userzy nie będą czekali na "wygenerowanie" miniaturek)
Edi Skraba

Edi Skraba Senior Project
Manager, Agencja
Reklamy Eura7

Temat: szybkość a generowanie miniatur...

Alan Gabriel B.:
Krzysztofie, ale czy wysokość i szerokość w nazwie pliku służą jako faktyczne parametry dla skryptu, czy tylko identyfikują z góry określone w configu wielkości?

Jeżeli tak, to odradzam. Bo Ci bota puszczą, który będzie generował tryliard rożnych rozmiarów do każdego znalezionego zdjęcia.

Można zdefiniować w skrypcie "generującym" jakie są dopuszczane rozmiary aby uniknąć takiego ataku. Wtedy rozmiary w nazwie mogą być parametrami dla skryptu.
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: szybkość a generowanie miniatur...

Edi Skraba:
Popieram metodę zaproponowaną przez Alana:
1. Tworzysz wszystkie miniaturki w trakcie upload (cache)
2. Na stronie identyczny mechanizm generalnie z tą różnicą, że jeżeli miniaturka jest już utworzona to ładuje ją z cache'a.

JA wcale nie proponowałem takiego mechanizmu :)
Edi Skraba

Edi Skraba Senior Project
Manager, Agencja
Reklamy Eura7

Temat: szybkość a generowanie miniatur...

Alan Gabriel B.:
Edi Skraba:
Popieram metodę zaproponowaną przez Alana:
1. Tworzysz wszystkie miniaturki w trakcie upload (cache)
2. Na stronie identyczny mechanizm generalnie z tą różnicą, że jeżeli miniaturka jest już utworzona to ładuje ją z cache'a.

JA wcale nie proponowałem takiego mechanizmu :)

Alan jak to nie :)

Agnieszka napisała:
zdecydowanie najszybsze rozwiazanie to generowanie miniaturek przy uploadzie...
...zdecydowanie bardziej elastyczne jest generowanie "w locie"

Ty jej odpisałeś:
@Agnieszko, jest jeszcze możliwość połączenia tych dwóch technik i ograniczyć udział PHP (bo przecież o to chodzi tak naprawdę) tylko do tego 1-wszego żądania.

Jerzeli chodzi o kwestie sprawdzania czy plik istnieje (czy jest cache) to akurat nie wiem ale jestem ciekaw czy szybciej zrobi to Apache czy PHP
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: szybkość a generowanie miniatur...

Edi Skraba:
Alan jak to nie :)

Ja chyba wiem najlepiej co proponowałem i na pewno nic nie wspominałem o generowaniu miniatur przy uploadzie.

Zapodałem pomysł, że żądanie nieistniejącego pliku z miniaturą przekierowywać do skryptu PHP, ale idąc dalej tym tropem można się pokusić o zrezygnowanie całkowicie z PHP.

Sens jest taki, że niekoniecznie docelowa pehapowa aplikacja musi generować te miniatury - nie wszystko (vide konfiguracja) musi być scentralizowane.

Moim zdaniem dużo lepiej sprawdził by się jakiś mały programik w C, albo modulik serwera, albo cokolwiek innego szybkiego i instancjonowanego (rezydującego w pamięci).

P.S. Cache to cache, a wygenerowany plik dostępny z poziomu public_html to już nie cache.
Edi Skraba

Edi Skraba Senior Project
Manager, Agencja
Reklamy Eura7

Temat: szybkość a generowanie miniatur...

Alan Gabriel B.:
Edi Skraba:
Alan jak to nie :)

Ja chyba wiem najlepiej co proponowałem i na pewno nic nie wspominałem o generowaniu miniatur przy uploadzie.

Oczywiście, że ty wiesz najlepiej, ale wypowiadasz się na forum i tak to mogą odebrać inni - np ja.
P.S. Cache to cache, a wygenerowany plik dostępny z poziomu public_html to już nie cache.

Jeżeli mechanizmem składowania systemu cache jest system plików to wygenerowany plik dostępny w public_html może być jednocześnie cachem jak i plikiem dostępnym z poziomu public_html (zależy jak się do niego dobierzesz). Ale to jest oczywiście względność punktu widzenia
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: szybkość a generowanie miniatur...

Edi Skraba:
Oczywiście, że ty wiesz najlepiej, ale wypowiadasz się na forum i tak to mogą odebrać inni - np ja.
Jeżeli mechanizmem składowania systemu cache jest system plików to wygenerowany plik dostępny w public_html może być jednocześnie cachem jak i plikiem dostępnym z poziomu public_html (zależy jak się do niego dobierzesz). Ale to jest oczywiście względność punktu widzenia

Edi, nie można wszystkiego tłumaczyć subiektywizmem. Wyraziłem się jasno i opisałem mój pomysł dosyć jednoznacznie. Nie pisałem słowa o generowaniu miniatur przy uploadzie, bo właśnie tego chcę uniknąć (to nie jest elastyczne rozwiązanie).

Co do cache to użycie tej nazwy sugeruje - w kontekście naszej dyskusji - udział PHP w jego dalszym przetwarzaniu. Gdy serwer przekazuje istniejący, wygenerowany wcześniej, plik z miniaturą do przeglądarki w żadnym wypadku nie mógłbym tego nazwać pobraniem z cache (tzw. cache hit).

Nomenklatura to istotna sprawa w programowaniu. Wystarczy spojrzeć jak początkujący programiści większość klas swoich hiper-duper CMSów nazywają *Managerami.

P.S. Edi, ostatniego akapitu nie kieruję do Ciebie to są raczej moje prywatne przemyślenia. Nie chciałbym, żebyś pomyślał, że próbuję tobie urągać.

Pozdrawiam, Alan
Edi Skraba

Edi Skraba Senior Project
Manager, Agencja
Reklamy Eura7

Temat: szybkość a generowanie miniatur...

@Alan
Spokojnie nie należę do tych osób co wszystko biorą od razu do siebie :) Po to jest forum, żeby można było polemizować na różne tematy.

P.S.
Już nie upierając się odnośnie twojego rozwiązania :) zauważ że moje jest również elastyczne. Mechanizm odpowiedzialny za generowanie plików jest elementem osobnym i jest odpalany zarówno przy uploadzie jak i przy wyświetlaniu plików oczywiście z wcześniejszym sprawdzeniem czy dana miniaturka już istnieje.

Upieram się jednak przy generowaniu miniaturek przy uploadzie ze względu na użyteczność. Lepiej obciążyć administratora wgrywającego pliki czasem potrzebnym na wygenerowanie niż użytkownika końcowego.
Przykład:
- Administrator wgrywa pojedynczo pliki do każdego artykułu dodając w ten sposób np 10 artykułów w ciągu tygodnia. Za każdym razem musi wprowadzić treść i wgrać obrazki więc i tak przewiduje na to większą ilość czasu.
- User wchodzi na stronę i ładuje listę artykułów na której generuje się te 10 miniaturek naraz no i czeka...

Pozdr

Następna dyskusja:

Ponownie Exif - generowanie...




Wyślij zaproszenie do