Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja kodu
boro11
post
Post #1





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 9.07.2010
Skąd: Warszawa

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


Witam!
Mam kod, który działa tak jak miał działać - tj. wykonuje wszystkie czynności jakie ma robić. Niestety obciąża mi serwer dosyć znacznie i spowalnia strony. Z indeksu przeniosłem go do jednej z podstron i trochę się poprawiło ale ta podstrona teraz działa wolno.

Oto kod:

  1. $sites = array();
  2. $limits = array();
  3. $count = array();
  4. $zap=array(1 => 'SELECT',2 => 'nazwa, limits',3 => 'FROM',4 => 'test_site');
  5. $query = $db->zap($zap);
  6.  
  7. while ($row = mysql_fetch_array($query))
  8. {
  9. $sites [$row['nazwa']] = $row['nazwa'];
  10. $limits [$row['nazwa']] = $row['limits'];
  11. $count [$row['nazwa']] = 0;
  12. }
  13.  
  14. $zap2=array(1 => 'SELECT',2 => 'site',3 => 'FROM',4 => 'test_sites',5 => 'WHERE ((status = "Approved") OR (status = "Pending"))');
  15. $quer = $db->zap($zap2);
  16. while ($row2 = mysql_fetch_array($quer))
  17. {
  18. if (in_array($row2['site'],$sites)) $count[$row2['site']]++;
  19.  
  20. if (($count[$row2['site']] > $limits[$row2['site']]) && ($limits[$row2['site']] != '~') && ($limits[$row2['site']]!='') && ($limits[$row2['site']]!='0'))
  21. {
  22. $zap3=array(1 => 'UPDATE',2 => 'test_site',3 => 'SET',4 => 'status="LIMITED"',5 => 'WHERE ((nazwa="'.$row2['site'].'") AND (status<>"SCAM"))');
  23. $db->zap($zap3);
  24. }
  25. }
  26.  
  27. $zap=array(1 => 'SELECT',2 => 'nazwa, limits',3 => 'FROM',4 => 'test_site');
  28. $query2 = $db->zap($zap);
  29. while ($row2 = mysql_fetch_array($query2))
  30. {
  31. if (isset($count[$row2['nazwa']])) $put = $count[$row2['nazwa']].'/'.$row2['limits'];
  32. else $put = '0/'.$row2['limits'];
  33. $zap=array(1 => 'UPDATE',2 => 'test_site',3 => 'SET',4 => 'refkow = "'.$put.'"',5 => 'WHERE nazwa="'.$row2['nazwa'].'"');
  34. $db->zap($zap);
  35. }


Dałoby się to jakoś zoptymalizować lub zrobić żeby robiło się np. raz na 10 minut, a nie z każdym wczytaniem strony?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


skoro update robisz w pętli i jest on zależny od zewnętrznego zapytania to wystarczyło by, gdybyś ten update robił w jednej transakcji na całą pętlę, poczytaj o tym...

oprócz tego pierwszą pętlę z UPDATE możesz załatwić w jednym zapytaniu gdyż zmienia się tylko warunek WHERE a reszta jest statyczna
SQL IN Operator
drugi update to już raczej trzeba zacząć transakcję przed pętlą i zakończyć za pętlą...

choć jeszcze to Ci się nie przyda, ale np. ja problem z aktualizacją wielu danych z plików XML (sporych więc parsowałem te pliki nie przez DOM a SAX) gdzie czasami trzeba było dodać nowe rekordy rozwiązałem w ten sposób, iż tworzyłem tabelę tymczasową identyczną i w transakcji robiłem insert, po czym zapytanie gdzie id się powtarzało (nie mam tam autoinkrementacji - można to dać też na inne unikalne rekordy) robiłem jednym zapytaniem UPDATE from SELECT , kolejnym insert from select, a kolejnym usuwałem tabelę tymczasową...
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 11:52