Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długość działania foreach
Forum PHP.pl > Forum > PHP
Creed
Witam, Piszę połączenie mojego sklepu internetowego z API jednej z hurtowni.
Muszę pobrać wszystkie produkty wraz z ich informacjami (opis, zdjęcia, id itp itd). Produktów jest około 20 tyś.
Cały mój kod pobierania tego wygląda tak:
Kod
foreach($kategorie as $kat)
            {
                $config['CategoryId'] = $kat['Id'];                     //dodanie do config zmiennej id kategorii
                $katalog = $this->client->getProductList($config);
                $produkty_temp[$kat['Id']] = $katalog->getProductListResult->Products->rowProductList;  //pobranie produktów dla danych kategorii
            }
            $config = array(                                            //config dla pobrania informacji o produkcie
                'SessionKey'    => $this->sesja['SessionKey'],
                'Language'      => 'pl-PL',
                'Currency'      => 'PLN',
                'PoductId'      => 0
                );
            $produkty = array(                                          //tablica przechowująca konkretne produkty, wraz z informacjami
                'Nazwa'             =>0,
                'Kategoria_Id'      =>0,
                'Obrazki'           =>array(),
                'Cena_Netto'        =>0,
                'Opis'              =>0,
                'Id'                =>0,
                'Kod_Produktu'      =>0,
            );
            foreach ($produkty_temp as $klucz => $produkt)
            {
                foreach($produkt as $prod)
                {
                    if(isset($prod->Id))
                    {
                        $config['ProductId'] = $prod->Id;
                        $prod = $this->client->getProductInfo($config);
                        $prod = $prod->getProductInfoResult->Products;
                        if(isset($prod->rowProductInfo))
                        {
                            $Prod = $prod->rowProductInfo;
                            if(isset($Prod->Id) && isset($Prod->Name) && isset($Prod->PriceNett))
                            {
                                $produkty[$i]['Nazwa']      = $Prod->Name;
                                $produkty[$i]['Id']         = $Prod->Id;
                                $produkty[$i]['Cena_Netto'] = $Prod->PriceNett;
                                
                                if(isset($Prod->Description) && $Prod->Description != "")
                                    $produkty[$i]['Opis']    = $Prod->Description;
                                if(isset($Prod->ImgURL->string))
                                {
                                    
                                    if(is_array($Prod->ImgURL->string))
                                    {
                                        $obrazki = array();
                                        foreach($Prod->ImgURL->string as $obrazek)
                                        {
                                            $obrazki[] = $obrazek;
                                        }
                                        $produkty[$i]['Obrazki'] = $obrazki;
                                    }
                                    else
                                    {
                                        $produkty[$i]['Obrazki'] = $Prod->ImgURL->string;
                                    }
                                    
                                }
                                $i++;
                            }
                            $this->client->doNoop($this->sesja);
                        }
                    }

zmienna $kategorie to tablica zawierająca listę kategorii. Jest ich dokładnie 347. Później muszę pobrać każdy produkt dając jako argument funkcji getProductInfo tablicę z konfikuracją w której jest właśnie id kategorii. Więc najpierw tworzę $produkt_temp gdzie kluczem jest id kategorii a wartością lista produktów z tej kategorii. Potem dla każdego indeksu tej tablicy tworzę już zmienną $produkt w której przechowuje konkretne produkty wraz z ich informacjami. Te wszystkie warunki niestety są potrzebne bo zdarza się (nie wiem czemu) że jest tam produkt który nie ma id lub nie ma ceny itp itd. A te zmienne są potrzebne. ImgURL czasami jest tablicą a czasami jest zmienną string. Całość dla około 20 tyś produktów potrafi się robić nawet pare godzin. Można to jakoś zoptymalizować?
Fifi209
Po co pobierasz wszystkie produkty?

Co to za sklep? Nie mamy klasy, której używasz.
camikazee
Kiedyś robiłem podobny skrypt i według moich obserwacji najwięcej czasu pochłania pobieranie obrazków. Dokładnie nie pamiętam jak to zoptymalizowałem, ale skrypt uruchamiany był kilka razy. Pierwsze odpalenie wrzucało kategorie i produkty, następne pobierały zdjęcia.
lukaskolista
Cytat
Można to jakoś zoptymalizować?
Pewnie ze mozna, ale nie jest to warte zachodu. Najwiecej czasu potrzeba na komunikacje z serwerem hurtowni, wiec optymalizacja samego skryptu wedlug mnie mija sie z celem. Jak napisales jest 20 000 produktow i kazdy ma obrazek, przeslanie 20 000 obrazkow troche trwa i nic na to nie poradzisz (poza kupnem szybszego lacza, ale to tez jest ograniczone laczem serwera hurtowni). Takie rzeczy po prostu troche trwaja, nie wykona sie to w minute.

Ewentualnie (jezeli sie da) pobierz wszystkie produkty z hurtowni za 1 razem i pozniej dociagaj jedynie obrazki.
Niktoś
Cytat
Pewnie ze mozna, ale nie jest to warte zachodu.
Ja myślę ,że nie można- wszystko zależy od sprzętu i łącza internetowego,a tego raczej żadnym językiem programowania nie przeskoczysz.
Można by w ogóle zrezygnować z pobierania plików graficznych i pobierać same produkty.W chwili kiedy użytkownik wchodzi na produkt,dopiero pobierać ten obrazek z serwera hurtowni.Tylko byś musiał znać, jak przypisują nazwy obrazków do nazw produktów.
Micchaleq
Ja osobiście przerobił bym to sobie na fora uwzględniając x produktów.

Po drugie jestem jeszcze ciekaw czy jest to działanie od 0 do 20 000 produktów, czy tylko jest to sprawdzanie różnic.
ShadowD
Ostatnio za pomocą curla musiałem przekopiować ~8k produktów z obrazkami bo właściciel sklepu był ta tyle miły by nie chcieć udostępnić bazy i kazał ręcznie kopiować z strony sprawa była mocno namieszana, ale najpierw pobrałem tylko i wyłącznie id każdego z produktów i ciepałem po 20 co minutę w cronie, zapisywałem i przy następnym wywołaniu kolejna 20'ka trochę się zeszło z przekopiowaniem, ale jak miał bym wnikać jak usprawnić kod nawet do 40 na minutę to zwyczajnie by mi się nie chciało i tak akcja jest tylko jednokrotna, następnie ew. wychwytywanie zmian nad czym polecam się już postarać, a teraz dodaj limit produktów które w danej jednostce czasu na pewno zostaną przekopiowane, dodaj jakiś margines błędu i co tą jednostkę czasu ustaw crona - nie ma po co się katować. ;-)
Pilsener
A musisz w PHP pobierać dane bezpośrednio ze strony? Z tego co wiem są programy do robienia zrzutów stron, zassiesz parę MB chwila moment a potem to sobie obrabiasz.
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.