Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[PHP] Optymalicaja autoloadera - zagadnienia

Ostatnio zmodyfikowano 2013-01-17 23:07
Autor Wiadomość
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.
P-74236
DejaVu
» 2013-01-17 19:31:53
Hę? autoloader? php? php + optymalizacja = sprzeczność?
P-74237
jsc
Temat założony przez niniejszego użytkownika
» 2013-01-17 20:07:36
@up
autoloader? php?

To dziwne zestawienie?

php? php + optymalizacja = sprzeczność?
Przy działaniu na ślepo raczej tak.
P-74239
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?
P-74242
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ń.
P-74243
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).
P-74248
« 1 »
  Strona 1 z 1