[PHP] Optymalicaja autoloadera - zagadnienia
Ostatnio zmodyfikowano 2013-01-17 23:07
jsc Temat założony przez niniejszego użytkownika |
[PHP] Optymalicaja autoloadera - zagadnienia » 2013-01-17 19:30:29 Jak w temacie, czyli na co trzeba zwrócić uwagę, aby autoloader był tak zwinny jak to tylko możliwe. |
|
DejaVu |
» 2013-01-17 19:31:53 Hę? autoloader? php? php + optymalizacja = sprzeczność? |
|
jsc Temat założony przez niniejszego użytkownika |
» 2013-01-17 20:07:36 @up To dziwne zestawienie? php? php + optymalizacja = sprzeczność? |
Przy działaniu na ślepo raczej tak. |
|
m4tx |
» 2013-01-17 20:48:33 php + optymalizacja = sprzeczność? |
Niby czemu? Mój znajomy jest wręcz maniakiem optymalizacji w PHP :P @jsc mógłbyś lepiej opisać swój problem? |
|
jsc Temat założony przez niniejszego użytkownika |
» 2013-01-17 21:07:27 Napisałem sobie narzędzie, które ma automatycznie ładować biblioteki z podanej lokalizacji i jednocześnie z katalogu zawierającego autorski framework. Postanowiłem też, że ten framework będzie miał zunifikowane zasady otworzenia struktury plików bibliotek i dzięki temu mogłem zaimplementować ładowanie interfejsów i abstractów z wyprzedzeniem oraz rozbudowanie nazw klas w zależności od uściślenie postaci głównego szablonu biblioteki. Na razie mam coś takiego: <?php /* Plik zawiera kod autoloadera
@author Jacek Strzemieczny @licencse GNU 3 */
class ladowarkaKlas { private $czyZarejestrowano = false; private $katalogFrameworku = 'C:\wamp\www\autoloader'; // Ścieżka na przykładowy katalog zawierający framework private $buforKatalogowFrameworku; // Iterator buforujący już przejrzane katalogi private function dodajPath ($sciezka) // Funkcja uzupełnia katalogi żródłowe dla ładowanych bibliotek { set_include_path (get_include_path (), $sciezka); } private function znajdzBiblioteke ($nazwaBiblioteki) // Wyszukuje katalog zawierający podaną bibilotekę i dodaje ją do listy katalogów żródłowych { $poczatekSzablonuNazwy = '/^\([a-zA-Z]+'; $koniecSzablonuNazwy = '[a-zA-Z]+$/D'; $szbalonNazwy = $poczatekSzablonuNazwy . $nazwaBiblioteki . $koniecSzablonuNazwy; if (!($this -> buforKatalogowFrameworku)) { $przeglądaczKatalogu = new DirectoryIterator ($this -> katalogFrameworku); $this -> przeglądaczKatalogowFrameworku = new filtratorKatalogów ($przeglądaczKatalogu); $this -> buforKatalogowFrameworku = new buforKatalogów ($przeglądaczKatalogowFrameworku, FULL_CACHE); } foreach ($this->przeglądaczKatalogowFrameworku as $wnetrzeKatalogu) { if ((is_dir ($wnetrzeKatalogu)) && ($szbalonNazwy == $wnetrzeKatalogu -> getFilename ())) { if (!(is_readable ($wnetrzeKatalogu))) { die ('Biblioteka jest niedostepna'); } return $wnetrzeKatalogu -> getPathname(); } } } private function zaladujDeklaracjeBiblioteki ($katalogBilioteki) { if (!(is_readable ($katalogBilioteki))) { die ('Biblioteka jest niedostepna'); }
$drzewoKatalogow = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($katalogBilioteki . PATH_SEPARATOR . deklaracja)); foreach ($drzewoKatalogow as $wnetrzeKatalogu) { if (!is_dir ($wnetrzeKatalogu)) { if (!(is_readable ($wnetrzeKatalogu))) { die ('Biblioteka jest niedostepna'); } include_once ($wnetrzeKatalogu -> getPathname ()); } } } private function namierzImplementacjeBiblioteki ($katalogBilioteki) { $drzewoKatalogow = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($katalogBilioteki . PATH_SEPARATOR . implementacja)); foreach ($drzewoKatalogow as $wnetrzeKatalogu) { if (is_dir ($wnetrzeKatalogu)) { if (!(is_readable ($wnetrzeKatalogu))) { die ('Biblioteka jest niedostepna'); } dodajPath ($wnetrzeKatalogu -> getPathname ()); } } } public function __construct ($gdzie) { restore_include_path (); if (!(is_readable ($this -> katalogFrameworku))) { die ('Framework jest niedostępny'); } $this -> dodajPAth ($this -> katalogFrameworku); if (!(is_readable ($gdzie))) { die ('Lokalizacja startowa jest niedostępna'); } $this -> dodajPAth ($gdzie); } public function autoload ($nazwaKlasy) { if (!(file_exist ($nazwaKlasy))) { $namiarNaBiblioteke = znajdzBiblioteke ($nazwaKlasy); zaladujDeklaracjeBiblioteki ($namiarNaBiblioteke); namierzImplementacjeBiblioteki ($namiarNaBiblioteke); } include_once ($nazwaKlasy); return true; } public function rejestruj () { if (!($this->czyZarejestrowano)) { spl_autoload_register(array($this, 'autoload')); $this->czyZarejestrowano = true; } } }
// Definicje iteratorów pomocniczych class filtratorKatalogów extends FilterIterator { private $iteratorZrodlowy; public function __construct ($zrodlo) { $this -> iteratorZrodlowy = $zrodlo; } public function accept () { if (is_dir ($this -> iteratorZrodlowy -> current ())) { return true; } else { return false; } } }
class buforKatalogów extends CachingIterator {
}
// Definicje wyjątków ładowanie bibliotek // Całkiem niedawno znalazłem set_exception_handler, więc dopiero zaczynam pisać obługę wyjątków ?>
Chodzi o to, żeby nie było przy ładowaniu bibliotek nie było zbędnych opóźnień. |
|
DejaVu |
» 2013-01-17 23:07:15 Nie ma znaczenia ile będzie się wykonywał skrypt - czy 1ms czy 10ms. Obciążenie generuje baza danych i to ona decyduje o wydajności frameworka, a nie skrypt ani czas jego ładowania. Każdy bajt kodu spowalnia czas ładowania skryptu, więc swoje klasy powinieneś pisać zarówno bez spacji, bez enterów jak i nazywać je jednym/dwoma znakami, aby uzyskać możliwie wysoką 'wydajność'. Niemniej jednak i tak baza danych będzie głównym czynnikiem decydującym o jakości 'frameworka'. Dawniej też starałem się pisać kod 'optymalnie' w php-ie, ale czas i przeprowadzone testy na żywym organizmie pokazały, że nie ma to najmniejszego znaczenia.
/edit: Dodam jeszcze, że takie IDE jak np. JetBrains PHP Storm wymaga pisania kupy gruzu w postaci komentarzy opisujących przyjmowane/zwracane argumenty po to, aby zapewnić pełne wsparcie Intellisense. Nawet komentarze są parsowane przez interpreter PHP i spowalniają kod, więc... wydajność wynikająca z działania skryptu jest akceptowalna nawet w komercyjnych projektach, w których ważniejsza jest właściwa dokumentacja kodu ponad zysk kilku milisekund (nic w praktyce nie wnoszących dla serwera). |
|
« 1 » |