![]() |
Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Problem stary jak świat: system wymaga włączenia sporej liczby plików i zarządzanie tym jest upierdliwe. Do tego nie należy włączać więcej kodu niż potrzeba, a najlepiej zrobić jakieś lazy load.
Oczywiście, technik jest wiele: 1) require_once rozsiane po plikach, najlepiej poprzedzone jakąś stałą, np. require_once ROOT_DIR . '/foo/Foo.class.php'; 2) Prado: deklarujemy namespacy - np. za pomocą funkcji using(), co dodaje nam ścieżki do include_path, a potem niech php znajdzie klasę. 3) Autoloader + mapa (nazwa klasy => ścieżka do pliku); autoloader wczytuje mapę i na jej podstawie jest w stanie znaleźć każdą klasę Są jeszcze jakieś inteligentne sposoby? Dobry mechanizm powinien być odporny na "przemeblowanie" struktury plików (np. chcemy połączyć kilka klas w jeden plik). BTW, włączanie plików bez klas (tylko funkcje i kod) jest gorsze, bo nie ma tego czegoś, czego można szukać po plikach... kolejna zaleta OOP? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
...mam i ja.
Stworzylem swojego autoloadera: - w konfigu podaje katalogi do rekursywnego przejrzenia - podaje rozszerzenia plikow ktore maja byc tokenizowane - mapa jest tworzona w std. formacie: nazwa_klasy => sciezka_do_pliku - i zapisywana w formacie .ini (moze dorobie wybor ini | php) I co najwazniejsze -- cachuje wyniki tokenizowania plikow (to nie to samo co 'mapa') -- tokenizowane sa tylko te co zostaly zmodyfikowane (okreslane przez filemtime()), co daje znaczna oszczednosc czasu. Zapisuje tablice:
Jak to wyglada w praktyce: - wczytuje ww. cache - przegladam katalogi i robie liste znajdujacych sie tam plikow - loop po tych wszystkich plikach: porownuje czas modyfikacji pliku z czasem zapisanym w cache - jesli plik zostal zmieniony to go tokenizuje i aktualizuje cache (+ ustawienie znacznika 'valid' w cache) - jesli nie zostal zmodyfikowany to tylko ustawienie znacznika 'valid' w cache - po przejrzeniu wszystkich plikow, usuwam te wpisy w cache, ktore nie maja znacznika 'valid', i usuwam znacznik 'valid' z tych, ktore go maja (tylko po to zeby go (znacznika) nie zapisac w cache) - uzyskuje tablice z wpisami nazwa_pliku --> klasy/interfejsy w min sie znajdujace + czas modyfikacji pliku - zapisuje to cache - na podstawie tego cache tworze mape Wlasciwosci - nowe pliki ktorych nie bylo w cache sa tokenizowane i dodawane do cache i mapy - pliki ktore byly w cache a teraz nie istnieja (nie ma ich w podanych w configu katalogach) sa usuwane z cache i mapy - pliki ktore byly w cache i nie zostaly zmienione nie sa tokenizowane (duuuza oszczednosc czasowa) - pliki ktore byly w cache i zostaly zmodyfikowane sa ponowanie tokenizowane -> aktualizacja cache Czasy wykonania: 6 klas / 5 plikow: 0.1137sec // bez cache 0.0041 sec // z cache dodanie dodatkowych plikow i klas, w sumie 355 plikow / 138 klas 4.3358 sec // bez cache 0.1672 z cache// z cache modyfikacja 3 z tych plikow (glowne pliki Smartyego -- 161kB) i utworznie mapy, z cache 0.7571 sec Kodu jest sporo: > 470 linii, jak dokoncze to dam linka. Pozostaje jeszcze fopisac __autoload()'a. Ten post edytował dr_bonzo 26.05.2005, 15:16:32 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 9.10.2025 - 19:40 |