[php] plik z tablica 600 elementową.. jak przyspieszyc działanie?, cache w pamięci serwera?? |
[php] plik z tablica 600 elementową.. jak przyspieszyc działanie?, cache w pamięci serwera?? |
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¶niki samochodowe - do zabudowy', '531_376' => 'Gło¶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 |
|
|
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.
|
|
|
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.
|
|
|
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. |
|
|
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.
-------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
21.03.2008, 17:32:41
Post
#6
|
|
Grupa: Zarejestrowani Postów: 93 Pomógł: 1 Dołączył: 12.08.2005 Ostrzeżenie: (10%) |
przemiel tablice wypluj to co chcesz a efekty inc'luduj
-------------------- web lowcy.com.pl gg 1675677
|
|
|
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 |
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 11:46 |