![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 173 Pomógł: 1 Dołączył: 26.10.2005 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Przygotowuję małą aplikację generującą miniaturki aukcji allegro (w oparciu o Allegro WebApi). Założenie jest takie, że co 15 minut program sprawdza czy pojawily się nowe oferty w aukcjach, czy zmienila się cena, itp itd. Przy okazji kopiuje miniaturke zdjecia z serwerow alllegro, wczesniej jednak sprawdzam czy nie mam już tego zdjęcia na swoim serwerze, bo po co kopiowac kilka razy to samo? No i problem z jakim przyszlo mi się zmierzyc, to problem wydajnośći, czasu wykonywania. - W najgorszym wypadku, aby wygenerować 6 miniaturek, skrypt potrzebuje prawie 8 sekund. - W najlepszym, gdy nie musze kopiować żadnych miniaturek z zewnatrz wygenerowanie tych 6 grafik trwa okolo 2,5 sekundy wyliczylem sobie, że samo kopiowanie miniaturki trwa ok 0,8 sekundy. Jesli używam tego skryptu sam - problemu nie ma. Jednak chce to udostepnic wiekszej rzeszy ludzi - komercyjnie. w momencie gdy z systemu zacznie korzystac juz ponad setka ludzi (co wydaje mi sie liczbą śmiesznie małą) czas wykonywania calego skryptu zbliza sie do magicznej granicy 15 minut!! a przecież Cron ma za zadanie co 15 minut odpalac skrypt by zaktualizowac miniaturki. poniżej wrzucam kod, może ktoś coś z niego wyczyta... ktoś ma pomysł jak to poprawić? a może należałoby wykorzystać tu inną technologię ![]()
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ma być szybciej? Użyj imagemagic zamiast gd2 to po pierwsze.
Po 2 sprawdź jak z tym kopiowaniem ... może zwyczajnie dysk na serwerze jest powolny (masz shared host czy dedyka?). Kolejna sprawa - workery na prawdę warto przepisać do jakiegoś kompilowanego języka. Nie chce tutaj wywołać wojny kolejnej ale php nigdy demonem szybkości w takich operacjach nie był - tak prosty kod możesz z powodzeniem przepisać do C++, lub chcoiaż jego "najcięższą" część. -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
Format JPEG pozwala na przechowanie miniaturki w metadanych.
Oznacza to, że gotowa miniaturka jest ukryta wewnątrz oryginalnego obrazka. Do "wyciągnięcia" takiej miniaturki służy funkcja exif_thumbnail. Oczywiście nie każdy JPEG będzie ją miał, to zależy generalnie od tago jakim algorytmem kompresującym grafika była ostatnio dręczona. Nie wnikałem które programy zostawiają te dane a które usuwają, nie wiem też jak sprawa wygląda w przypadku allegro, trzeba by poświęcić te 15 minut i sprawdzić. Nie widzę abyś używał funkcji imagecopyresampled za to widzę że stosujesz imagecopy i w rezultacie i zamiast ładnej miniaturki dostajesz przewlekłą kwadratoliozę sierpowatą. Tak czy inaczej.. Optymalizowanie skryptów przetwarzających obrazki to rozległy temat. Próba wykonania tu dobrej roboty bez wiedzy jak działają algorytmy GD2 przypomina błądzenie w ciemnościach. Pozostaje metoda prób i błędow, przyda się tez odrobina zdrowego rozsądku.. Moje dobre rady, będące jednocześnie strzałami na ślepo: - Zmniejsz wielkości oryginalnego obrazka, przypuszczalnie skrypt będzie działał szybciej kiedy przyjdzie mu wygenerować miniaturkę z grafiki o mnieszym rozmiarze.. - Ustal czy ImagesMagic nie radzi sobie lepiej z tworzeniem thumbinali.. - Generuj "na szybko" miniaturke o gorszych parametrach i kolejkuj generowanie miniaturki o parametrach docelowych aby uniknąć chwilowych przeciążeń serwera. Powodzenia! Ten post edytował wNogachSpisz 5.03.2011, 03:29:44 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 173 Pomógł: 1 Dołączył: 26.10.2005 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
jak narazie korzystam z serwera wirtualnego (DreamHost), ale mysle ze gdy przyjdzie krytyczny moment, bedzie mnie stac na serwer dedykowany.
Jednak nie wiem na ile to pomoze, bo nie o predkosc wykonywania nowej grafiki w chwili obecnej chodzi, a o predkosc kopiowania jej pierwowzoru... z serwerow allegro kopiuje naprawde małe pliki: 128x96px, wiec nie mam sie co bawic w wyciaganie danych EXIF. Myslalem tez o ImageMagic, i w sumie bede musial spróbowac, ale mysle ze zyskam stosunkowo nie wiele. Dlatego po glowie chodzi mi juz wykorzystanie innej technologii, ale nie wiem jakiej... poza tym nie znam innej niz PHP - ale jesli bedzie trzeba to sie naucze ![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
nie analizowałem dokładnie skryptu ale wygląda na to, że najwęższym gardłem są synchroniczne połączenia z netem po zapytania i soap i obrazki...
skoro łączysz się aż tyle razy (z twoich wyliczeń i różnicy wynika, że za każdym razem średnio pobierasz 5-6 minaturek + połączenie jeszcze z samą stroną przez SOAP) wykonujesz około 500 połączeń dla 100 userów na same obrazki i to liniowo - skrypt jest wstrzymywany do czasu pobrania poprzedniego - rozwiązaniem może być połączenie asynchroniczne lub chociaż podczymanie połączenia jeśli serwer allegro to wspiera 'keep-alive'... obrazki pobrać możesz asynchronicznie za pomocą curl_multi lub socketów: http://wezfurlong.org/blog/2005/may/guru-multiplexing oczywiście wtedy logikę wykonywania pewnych czynności pasuje przerzucić na zdarzeniówkę... możesz jeszcze spróbować porozbijać skrypt na osobne wykonywanie procesu w tle dla danego usera - ale wyrzucenie wszystkich 100 na konkurujące procesy nie będzie też najlepszym pomysłem: http://robert.accettura.com/blog/2006/09/1...ssing-with-php/ -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 10:48 |