![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 24.09.2003 Skąd: Giżycko / Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Próbuję napisać własny system szablonów. Właściwie to go napisałem, ale niestety chodzi on zdecydowanie za wolno, więc próbuję go napisać od nowa ![]() Mam pytanie odnośnie parsowania szablonu. Załóżmy że mamy taki plik test.tpl Kod <!-- BEGIN nazwa_sekcji -->
Stała: {JAKAS_STALA}<br> Sekcja językowa: {L_User}<br> Przesłane ze skryptu: {V_TEST_VALUE}<br> <!-- END nazwa_sekcji --> I teraz w kodzie php: [php:1:c76ea6911f]<? $Tpl = new Tpl(); // ustawiamy aktualny szalbon na test.tpl $Tpl -> set ("test"); // dodajemy do szablonu jakas wartosc $Tpl -> add ("TEST_VALUE", "wartosc"); // ustalamy stałą define ('JAKAS_STALA', "wartosc_stalej"); // i jeszcze wartosc z jakiejs tablicy $lang = array(); $lang['User'] = "Użytkownik"; // pokazujemy zparsowany szablon print $Tpl -> get ("nazwa_sekcji"); ?>[/php:1:c76ea6911f] I tutaj moje pytanie: jak napisać metodę klasy Tpl, żeby sprawdzała 3 różne typy zmiennych: stałe, przesłane ze skryptu oraz indeksy tablicy... Czyli żeby zamieniała: {L_Index} na $lang['Index'] {CONST} na constant("CONST") {V_ZMIENNA} na $this->data["ZMIENNA"] (czyli przeslana ze skryptu) Ten kod działa, ale bardzo wolno się wykonuje... Może jakieś sugestie? [php:1:c76ea6911f]<? /* pominalem tutaj definicje klasy itd., to jest metoda parse() */ function parse($section, $txt) { // wylapujemy sekcje z pliku // $pattern = "#<!-- BEGIN ".$section." -->(.*?)<!-- END ".$section." -->#s"; preg_match_all ($pattern, $txt, $_arr); $txt = $_arr[1][0]; // teraz wylapujemy wszystko w nawiasach klamrowych {jakis_tekst} // preg_match_all ("/{(.*?)}/si", $txt, $words); $patterns = array (); $replacements = array (); foreach ($words[1] as $key => $value) { $word = $words[1][$key]; $start = substr ($word, 0, 2); $patterns [] = "{$word}"; if ($start == "L_") { $word = $lang [substr ($word, 2)]; } elseif ($start == "C_") { $word = $c_lang [substr ($word, 2)]; } elseif ($start == "V_") { $word = $this -> V_[substr ($word, 2)]; } else { if (defined ($word)) $word = constant ($word); else $word = ""; } $replacements [] = $word; } $i = count ($patterns); while ($i--) $txt = ereg_replace ($patterns[$i], $replacements[$i], $txt); return $txt; } ?>[/php:1:c76ea6911f] Naprawde sie troche z tym mecze i bede wdzieczny za wszelkie podpowiedzi... Jak to da sie zrobic prościej? pozdrawiam Denver -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 2.03.2004 Skąd: Ziemia Giżycka Ostrzeżenie: (0%) ![]() ![]() |
Co do prędkości to najlepszym wyjściem jest cache.
A co do parsowania, to możesz np. pozmieniać ograniczniki, inne do tablic, inne do stałych itd. Możesz również ująć to w nazwie, czyli nazwę tablicy zaczynaj od A_, stałej od C_, a zmiennej od A_. Potem po ich pobraniu po prostu to sprawdzaj. -------------------- My name is Luke... Lucky Luke
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 24.09.2003 Skąd: Giżycko / Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Tylko ja sie zastanawiam, czy nawet po zmianie stałych na {C_STAŁA} i zmiennych indeksow tablicy na {T_Indeks} nadal zostawić moje rozwiązanie? Czy ono jest wystarczająco wydajne do wykorzystania w skryptach forum?
-------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 24.09.2003 Skąd: Giżycko / Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Chciałbym nadmienić, że w przypadku niekorzystania z systemu szablonów na moim forum, czyli gdy daję po prostu print nie bawiąc się w szablony, to skrypt chodzi błyskawicznie, natomiast z szablonami - około 0,7-0,8 sekundy podczas przeglądania topica...
-------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 216 Pomógł: 0 Dołączył: 9.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ja napisalem swoj system szablonow. Wykonuje sie calkiem szybko, ok 25 pol wyciaganych jest z bazy danych, ladowanych do tabeli, nastepnie wyciaga inne dane w zalerznosci od tego jaki jest autor , np : jesli autor = Ace to szuka jego hasla i wstawia je, dodatkowo includowanie, oraz funkcja warunkowa.
wszystko wykonuje sie w ok 0.1 sek... ale porzucilem projekt szablonow bo funkcja warunkowa psula sie czesto - tzn nie wszystkie warunki dzialaly... wlasnie pytanie mam... w jakis sposob zrobic cache'owanie ? na jakiej zasadzie mozna to zrobic, jakies funkcje sa potrzebne. Nie wiem na jakiej zasadzie dziala takie cachowanie w generowaniu strony. Jesli moglby ktos wytlumaczyc mi jak to dziala, byl bym wdzieczny. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 132 Pomógł: 0 Dołączył: 24.09.2003 Skąd: Giżycko / Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Zdaje sie ze chodzi tu o to, ze pliki szablonow sa parsowane przed ich uruchomieniem, aby strona nie musiala za kazdym razem ich parsowac - robi to parser tylko jeden raz, a strona korzysta juz z gotowego sparsowanego kodu.
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 216 Pomógł: 0 Dołączył: 9.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
hm.. no dobra, to wiedzialem, ale chodzi mi bardziej o to czy musze napisac sam jakies funkcje ktore sprawdza czy plik istnieje z cache , jesli nie to parsuje, jesli jest to otwiera go i pomija parsowanie... czy istnieja juz funkcje ktore ulatwiaja to ?
czyli, mam pisac sam funkcje do cacho'wania, czy sa jakies gotowe funkcje w php... ? |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 216 Pomógł: 0 Dołączył: 9.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Napisalem swoj system do cache... W sumie na moich szablonach uzyskuje predkosc 0.025 - 0.03 przy odczytywaniu z cache, gdy normalnie odczytywanie danych trwalo by ok 0.07 sek... musze sprawdzic jeszcze jak to dziala na duzo wiekszych obliczeniach
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 03:00 |