Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] plik z tablica 600 elementową.. jak przyspieszyc działanie?, cache w pamięci serwera??
kukix
post 20.03.2008, 23:47:09
Post #1





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Witam.

Mam tablice wygladającą w ten sposób:
Kod
<?
$category=array (
'1_383' =>
array(
'name' => 'Anteny pokojowe',
),
'1_540' =>
array(
'name' => 'Baterie, akumulatory, ładowarki',
'elements' =>
array (
'540_519' => 'Akumulatory',
'540_520' => 'Baterie',
'540_522' => 'Ładowarki akumulatorowe',
),
),
'1_531' =>
array(
'name' => 'Car Audio-Video',
'elements' =>
array (
'531_375' => 'Gło&para;niki samochodowe - do zabudowy',
'531_376' => 'Gło&para;niki samochodowe - kolumny',
'531_382' => 'Samochodowe Akcesoria',
'531_379' => 'Samochodowe radioodtwarzacze',
'531_380' => 'Samochodowe radioodtwarzacze Video',
'531_381' => 'Samochodowe wzmacniacze',
),
),
);


w tablicy tej występuje ponad 600 różnych pól.

Zastanawioam sie, czy można jakoś przyspieszyc operacje na tej tablicy.
Głównie korzystam z foreach() i dalej różne warunki..

Slyszalem, że można zrobic cache tej tablicy w pamięci serwera..
Tablica ta jest praktycznie cały czas niezmienna.. cały czas to samo..

prosze o podpowiedź.
Bede bardzo wdzięczny za wszelką pomoc.

Ten post edytował kukix 20.03.2008, 23:49:13
Go to the top of the page
+Quote Post
Moli
post 21.03.2008, 00:34:49
Post #2





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Do cache możesz użyć serialize i unserialize.
Go to the top of the page
+Quote Post
phpion
post 21.03.2008, 07:13:19
Post #3





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Może rób cache (twórz pliki trzymane na serwerze) na podstawie tej tablicy? Chodzi mi np. o wygenerowanie menu (bo pewnie to robisz) na podstawie tych danych i zapisanie go do jakiegoś pliku, a potem na stronie bezpośrednie includowanie go.
Go to the top of the page
+Quote Post
siemakuba
post 21.03.2008, 09:01:44
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Możesz spróbować przepisać to bez użycia foreach, bo foreach na swoje potrzeby tworzy sobie kopię tablicy. Tym samym, masz w pamięci dwa duże obiekty.
Ale czy dużo na tym zyskasz - ciężko powiedzieć. Może za dużo i mało optymalnie dzieje się w samym foreach? Dużo tam mielisz te dane?

pozdr.
Go to the top of the page
+Quote Post
c3zi
post 21.03.2008, 11:57:46
Post #5





Grupa: Zarejestrowani
Postów: 266
Pomógł: 20
Dołączył: 15.11.2006
Skąd: Koszalin

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


Mozesz zrobic najpierw skrypcik, ktory wygeneruje tobie jakis cache, np. na podstawie klucza( tak beda nazywac sie elementy cache'u ). Mozesz skorzysta z lekkiej PEARowskiej biblioteki: CACHE_LITE.


--------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Go to the top of the page
+Quote Post
andrzejb
post 21.03.2008, 17:32:41
Post #6





Grupa: Zarejestrowani
Postów: 93
Pomógł: 1
Dołączył: 12.08.2005

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


przemiel tablice wypluj to co chcesz a efekty inc'luduj winksmiley.jpg


--------------------
web lowcy.com.pl gg 1675677
Go to the top of the page
+Quote Post
kukix
post 21.03.2008, 19:13:20
Post #7





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Dzieki chłopaki za odpowiedzi.
No wlaśnie to jest już tablica, którą includuje.
Dane pobieram z bazy sql przerabiam dużym skryptem igeneruje taką tablice, zapisuje ją do pliku.

Skoro foreach laduje jeszcze raz do pamięci to moze wykorzystac do tego " while (list($item,$key) = each($elements)) { }" ?


Jeżeli chodzi o serialize i unserialize to nie rozumie do końca działania tej funkcji. Domyslam sie , że serialize ładuje do pamięci a unserialize czysci pamiec. Tylko to chyba nie o to chodzi. Operacja na tablicy jest przy każdym wywołaniu strony wykonywana tylko raz. tak więc nie ma sensu robic serialize i unserialize jak skrypt tylko raz wykonuje operaxcje na skrypcie. Chodzi mi bardziej o cos takiego jak jest przy sql'u. tzn żeby serwer trzymał tablice w pamieci dla nastepnego wykonania skryptu. chociaż teraz tak sobie mysle, że to raczej niemozliwe.


oto moj kod pracujący na tej tablicy:

Kod
function gen_menu($param_zakladka='', $param_kategoria='') {
  $kod_html='';
  include('include/kategorie.php');
  $q=0;
  if (is_array(@$category)) {
    reset($category);
    foreach ($category as $id=>$n_category){

      $name=$n_category['name'];
      $elements=@$n_category['elements'];
      if (!empty($param_zakladka)) {
        if (!empty($param_kategoria)) { //wyświetlamy tylko z tej kategorii i zakladki
          $param = $param_zakladka.'_'.$param_kategoria;
          if ($id == $param) {
            print ($name.'<br>');
            ////f (is_array(@$elements)) { narazie tak
            //  gen_submenu($elements,1);
            //}
          }
        } else { //wyswietlamy tylko z tej zakladki
          $param = $param_zakladka.'_';
          if (strpos($id, $param) !== false) {
            //print ($name.'<br>');
            $q++;//potrzebne do kodu html
            $kod_html .= gen_menu_html($param_zakladka,$id,$name,$param_kategoria,$q);
          }
        }
      } else { //wyswietlamy wszystkie
        if (!empty($param_kategoria)) { //wyświetlamy tylko z tej kategorii
          $param = '_'.$param_kategoria;
          if (strpos($id, $param) !== false) {
           // print ($name.'<br>');narazie
           // if (is_array(@$elements)) {
           //   gen_submenu($elements,1);
            //}
          }
        } else {
          //print ($name.'<br>');
         // if (is_array(@$elements)) {//narazie
         //   gen_submenu($elements,1);
         // }
        }
      }
    }
  }

  return $kod_html;
}



function gen_submenu($elements=array(),$level) {
        
  while (list($item,$key) = each($elements)) {
    
    if (is_array($item)) {
      // dany element jest drzewem
      $id=key($item);
      $name=$item[$id]['name'];
      $new_elements=$item[$id]['elements'];
      $level++;
      
      $name=addslashes($name);
      
      gen_submenu($new_elements,$level);
      $level--;
    } else {
      // dany element jest lisciem
      $kat_name=$key;                
      $kat_id=$item;
      
      //print('<font color="red">  '.$kat_name.' </font><BR>');  
      $id=$item;
      
    }
  } // end while

  return(0);
}



dzieki wielkie za odpowiedzi.

Ten post edytował kukix 21.03.2008, 19:33:48
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 11:46