Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]file_get_contents OPYMALIZACJA kodu. Strasznie długie ładownie.
kielich
post
Post #1





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


WItam,
Napisałem klasę, lecz dane pobierne są ze sklepu intenetowego. FIRMA => części => rodzaj_cześci => szczegóły towaru. Informacje wyszukują się idealnie. Przy "ostatnim etapie" - wyciąganie ceny produktu. Skrpty straaaasznie muli , ponad 5min co składnia mnie do nacisnięcia "ESC" (IMG:style_emoticons/default/sad.gif) . Proszę o pomoc

  1. <?php
  2.  
  3. class Klocki{
  4.  
  5. const wzorzec_links = '#<li><a.*href=\"([^\"]*)\".*>([^\"]*)<\/a><\/li>#';
  6. const wzorzec_price = '#<span itemprop="price">([^\"]*)</span>#';
  7. const wzorzec_name = '#<span itemprop="name">([^\"]*)</span>#';
  8. private $linksAll = array();
  9.  
  10.  
  11.  
  12. private function getData() {
  13. $output = file_get_contents('link');
  14. preg_match_all(self::wzorzec_links, $output, $links);
  15.  
  16. return $links[1];
  17. }
  18.  
  19. private function parseData() {
  20. foreach(Klocki::getData() as $linkMore){
  21. preg_match_all(self::wzorzec_links, file_get_contents($linkMore), $links);
  22. foreach($links[1] as $linksMore){
  23. preg_match_all(self::wzorzec_links, file_get_contents($linksMore), $links);
  24. foreach($links[1] as $link){
  25. $linksAll[] = $link;
  26. }
  27. }
  28. }
  29. return $linksAll;
  30. }
  31.  
  32. public function getInfo(){
  33. if(Klocki::parseData() == true){
  34. foreach(Klocki::parseData() as $link){
  35. $outputs = file_get_contents($link);
  36. preg_match(self::wzorzec_price, $outputs, $price);
  37. preg_match(self::wzorzec_name, $outputs, $name);
  38. }
  39. }
  40. }
  41. }
  42.  
  43. Klocki::getInfo();
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52. ?>
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
jaslanin
post
Post #2





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


podrzuć jakieś dane cobyśmy mogli sobie po testować bez pisania sobie wszystkiego z palca, bo nie każdemu się będzie chciało + jaki chcesz mieć dla tego output, jaki cel osiagnąć
Go to the top of the page
+Quote Post
kielich
post
Post #3





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


  1. private function getData() {
  2. $output = file_get_contents('http://www.123drukuj.pl/Tusze-do-drukarek-p1.html');
  3. preg_match_all(self::wzorzec_links, $output, $links);
  4.  
  5. return $links[1];
  6. }


Reszta bez zmian. Po wywołaniu print_r(Klocki::parseData()); - oczywiście zmienić private na public , dostaje ładne linki i pózniej w getInfo() w foreach , chciałem wyswietlić cene. Lecz strasznie długo ładuje :/
Go to the top of the page
+Quote Post
!*!
post
Post #4





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


To co podałeś jest bez sensu. A jak chcesz optymalizacji, to pobierz źródło raz, zapisz je w zmiennej i na niej operuj, a jak już za pomocą jednego wyrażenia pobierzesz dane, to tak jak wyżej, zapisz w zmiennej i na nich operuj, a nie robisz pętle w pętli dla pętli i to z file_get_content.
Go to the top of the page
+Quote Post
kielich
post
Post #5





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


No dobrze ale pętli i tak się nie pozbędę. Muszę jakoś obrobić te dane. ? Może jakiś przykład mógłbym prosić ?

Tutaj nie mam jednego źródła - ta sama strona. Tylko "skaczę" po linkach - więc muszę pobierać nową treść stron.

Ten post edytował kielich 2.04.2013, 12:49:11
Go to the top of the page
+Quote Post
!*!
post
Post #6





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Obróbka istniejącej zmiennej, to nie to samo co obróbka danych które pobieram za każdym razem.
Go to the top of the page
+Quote Post
kielich
post
Post #7





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


ALe ja przechodzę z linku na link. mając tablice linków ponad(200linków) to muszę "poskakać" - po kazdym i wyciągnąć cenę
Go to the top of the page
+Quote Post
!*!
post
Post #8





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Nie rozumiem problemu. Mam link A, pobieram jego źródło w celu sprawdzenia czy są linki do strony B, jak są, zapisuję je do tablicy. Jak już mam wszystkie linki, sprawdzam czy znajduje się w nich nazwa i cena, jak tak, uzupełniam tablice. Koniec. Na moje oko jest to jedna pętla, max 2.
Go to the top of the page
+Quote Post
kielich
post
Post #9





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


FIRMA => części => rodzaj_cześci => szczegóły towaru - jak widać mam link A wchodzi dalej mam B jak mamy dalej C i dopiero produkt więc jak możesz mieć 1 pętle ? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
artuross
post
Post #10





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Cytat(!*! @ 2.04.2013, 14:06:38 ) *
Nie rozumiem problemu. Mam link A, pobieram jego źródło w celu sprawdzenia czy są linki do strony B, jak są, zapisuję je do tablicy. Jak już mam wszystkie linki, sprawdzam czy znajduje się w nich nazwa i cena, jak tak, uzupełniam tablice. Koniec. Na moje oko jest to jedna pętla, max 2.


On ma racje, w jego przypadku na podstronach znajduja sie kolejne podstrony, wiec nie wystarczy wejsc w jeden link, zeby uzyskac cene. Trzeba wejsc na kolejny i kolejny.

Kielich, czemu sie dziwisz, ze trwa to 5 minut? Skoro polaczenie z tyloma stronami troche trwa, dodatkowo to musi byc obrobione za pomoca regexp, ktory tez do najszybszych nie nalezy. Moze powienienes sprawdzic jaki zakres bitow potrzebujesz pobrac? Mniej szukania, dzialalby ciut szybciej, aczkolwiek nadal jest to z 500 stron lub cos w tym stylu.
Go to the top of the page
+Quote Post
kielich
post
Post #11





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


Dokładnie jest to 5160 linków , przerobiłem że mam w jednej funkcji w drugiej przerabiam a w trzeciej wyświetlam. Lecz pozbycie się pętli jest NIEMOŻLIWE.
Bardzo proszę o jakąś pomoc.
Go to the top of the page
+Quote Post
artuross
post
Post #12





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Czlowieku zrozum, ze tego nie przyspieszysz! Nie masz infrastruktury Google w domu, zeby obsluzyc taka ilosc zapytan na raz. To wszystko trwa, z reszta serwery tego sklepu tez nie maja, a i one musza wygenerowac zawartosc.
Go to the top of the page
+Quote Post
!*!
post
Post #13





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Jest różnica między 200 a 5160, taka tyci.

Cytat
Czlowieku zrozum, ze tego nie przyspieszysz! Nie masz infrastruktury Google w domu, zeby obsluzyc taka ilosc zapytan na raz. To wszystko trwa, z reszta serwery tego sklepu tez nie maja, a i one musza wygenerowac zawartosc.

Chyba że wykona to równolegle, skrypt podzieli linki na partie i w tym samym czasie wykona do nich odwołanie.
Go to the top of the page
+Quote Post
kielich
post
Post #14





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


Cytat
Chyba że wykona to równolegle, skrypt podzieli linki na partie i w tym samym czasie wykona do nich odwołanie.


Co masz na myśli (IMG:style_emoticons/default/questionmark.gif) Możesz podać jakiś przykład ?

Ten post edytował kielich 2.04.2013, 14:28:28
Go to the top of the page
+Quote Post
artuross
post
Post #15





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Cytat(!*! @ 2.04.2013, 15:19:36 ) *
Chyba że wykona to równolegle, skrypt podzieli linki na partie i w tym samym czasie wykona do nich odwołanie.


Mysle, ze to nie znacznie przyspieszy caly proces, bo:
1. on pobiera linki z jednej strony, dopiero przechodzi do drugiej, z niej pobiera, przechodzi do 3. strony, znow pobiera i dopiero z 4. strony pobiera cene.
2. serwer nadal musi obsluzyc kilkaset zapytan, w ktorych trzeba pobrac dane z bazy, itd., itp.

W najlepszym przypadku przyspieszy calosc o kilkanascie sekund (tak mysle, nie mowie ze tak jest NA PEWNO), a w najgorszym wykona mini-DoS i bedzie czekal jeszcze dluzej. Do tego dochodzi zabezpiecznie antyDDoS. Jesli serwer ma jakies oprogramowanie i faktycznie skrypt dzialalby powiedzmy 2x szybciej, to wykonanie 5160 zapytan w ciagu ~3 minut daje dosyc spora sume zapytan/sekunde z jednego adresu IP, a wtedy zamiast 5 minut poczeka sobie 15 albo i dluzej (IMG:style_emoticons/default/smile.gif)
Nic tylko probowac (IMG:style_emoticons/default/biggrin.gif) Ale nadal jestem zdania, ze nie spadnie ponizej 4 minut.

@up: http://www.php.net/manual/en/function.curl-multi-init.php

Ten post edytował artuross 2.04.2013, 14:31:11
Go to the top of the page
+Quote Post
!*!
post
Post #16





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Nie mam pojęcia o działaniu równoległym w PHP (i czy jest samo w sobie jakieś narzedzie które to ulatwia), jak potrzebuję to na szybko piszę coś w bashu. Chodzi o to że jak masz skrypt A.php to w nim pobierasz linki od 0 do 300 i tak samo odpowiednio dla skryptu B.php, C.php itd. Później w konsoli wklepujesz
Cytat
php A.php & php B.php &
itd. w linux & na końcu odpala skrypt w tle, a php nazwapliku.php uruchamia nowy parser.

edycja
@artuross - tak, z tym tez trzeba się liczyć, ale kto mówi że trzeba pobierać wszytko razem i za jednym zamachem?

Ten post edytował !*! 2.04.2013, 14:36:20
Go to the top of the page
+Quote Post
artuross
post
Post #17





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Cytat(!*! @ 2.04.2013, 15:34:02 ) *
@artuross - tak, z tym tez trzeba się liczyć, ale kto mówi że trzeba pobierać wszytko razem i za jednym zamachem?


No teoretycznie nikt nie mowie, ale problem w tym, ze kielich chcialby, aby to wszystko dzialo sie szybciej, wiec jezeli i tak bedzie musial czekac to chyba nie osiagnie zamierzonego efektu.
Wg mnie zostaw tak jak jest, a i tak powinienes sie cieszyc, ze nie maja SSL bo czekalbys 3x dluzej (IMG:style_emoticons/default/biggrin.gif) Albo sprobuj pobierac tylko okreslone bity z calego zapytania, bo jak na razie bierzesz cala zawartosc strony: 'QAZWSXEDCRFVTGBYHNUJMIKOLP', a Ty potrzebujesz tylko 'DCRFVTGBYHNUJMIKOLP'

Ten post edytował artuross 2.04.2013, 14:42:34
Go to the top of the page
+Quote Post
!*!
post
Post #18





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Będzie szybciej, bo skrypt nie będzie czekał aż wykona się w całości, tylko w tym samym czasie wykona się pobieranie poszczególnych grup linków. To tak jak z zakładkami w przeglądarce, jak otwierasz ich 5, to nie czekasz po kolei aż otworzy się 1 potem 2, 3, 4 i na końcu 5, tylko wczytują się od razu wszystkie naraz. Ograniczeniem jest tu jedynie łącze, zabezpieczenia serwera, ale przyspieszenie jest możliwe.
Go to the top of the page
+Quote Post
artuross
post
Post #19





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Tylko, ze gdy otwierasz karty w przegladarce otwierasz najczesciej rozne witryny, a nawet jezeli to jest ten sam serwer, to nie obsluguje on 300 wejsc w jednej chwili. A wydaje mi sie (tutaj nie jestem pewien), ze cURL nie obsluguje Keep-Alive, wiec i tak dochodza DNSy, cookies, itd. Z reszta, nie wazne, nie spierajmy sie kto ma racje (dobra, na 90% Ty masz racje (IMG:style_emoticons/default/wink.gif) ).

@kielich, wyprobuj kilka opcji, ale tak czy siak, skrypt nie wykona sie w 10 sekund (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kielich
post
Post #20





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


A w jaki sposób moge pobrać odpowienie bity - długość ciągu źródła (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.09.2025 - 19:57