ďťż

[php]optymalizacja kodu

       

Podstrony


telcocafe

zrobiłem sobie stronę w php a wszystkie funkcje jakie używam wstawiłem do pliku funkcje.php który jest includowany przez index.php (dla wygody i przejrzystości pracy :P). funkcji jest dosyc dużo i są one raczej obszerne, a zauważyłem że parser php przy includowaniu tego pliku sprawdza wszystkie funkcje czyli niepotrzebnie marnuje czas i obciąza serwer ponieważ i tak większość tych funkcji nie będzie używana :/ da się jakoś uniknąć tego wczytywania ? niby taka drobnostka ale po co niepotrzebnie obciążać serwer :)



Użyj: zamiast funkcji include() ~ require()

Pogrupuj funkcje wg przeznaczenia i podziel je na kilka plików. Najczęściej używane pozostaw w głównym pliku funkcji, który będziesz dołączał za każdym razem. Pozostałe możesz dołączyć w poszczególnych modułach bądź instrukcjach warunkowych. :)


Użyj: zamiast funkcji include() ~ require()
ale co to mi da ?! nic :P ... przecież include i require to jest to samo :P jedyna różnica polega na tym że inlcude zwraca w razie niepowodzenia warringsa i skrypt jest wywoływany a require zwraca fatal errora i skrypt jest przerywany :)

chodzi o to ... żeby wczytywać funkcje wtedy kiedy będzie ona potrzebna czyli przy jej wywołaniu ... po co wczytywać nieużywaną funkcję ?!

wyjaśnie na przykładzie :P otóż jeśli mamy coś takiego:
if($liczba == 7) { echo('liczba jest siedem'); //instrukcje jakieś } else { echo('liczba jest inna niż siedem'); //instrukcje jakieś }
to jeżeli $liczbą będzie równa 7 to instrukcje else nie bądą wogóle sprawdzane, może tam być nawet tysiąc błędów i parser nie zwróci na to uwagi, natomiast jeśli mamy kilka zdefiniowanych kilka funkcji i w jakiejś z nich zapomnimy średnika to parser od razu wywala nam błąd mimo że wcale danej funkcji nie wywoływaliśmy :) nie chodzi tu o to że wyskakuje błąd ale o to że funkcja jest sprawdzana mimo że nie była wywoływana ! czyli marnowanie czasu i serwera :/ ... nie można jakoś zrobić tak żeby funkcje były tylko zadeklarowane a w przypadku ich wywołania były definiowane ?



Cały skrypt jest kompilowany do kodu operacyjnego. Jeżeli gdziekolwiek znajdzie się błąd, parser wywali błąd parse error, nawet w instrukcji warunkowej. Im więcej kodu, tym dłużej trwa kompilowanie (chyba, że funkcje nie są duże). :)
Jeśli już to:
function DefiniujBlokFunkcji() { function A() {} function B() {} }Tylko jak już pisałem - jeżeli funkcje zawierają dużo kodu i nie są używane za każdym razem, lepiej przenieść je do innego pliku.

Drobna poprawka... Samo include/reguire zajmuje więcej czasu niż samo prasowania. Bo musi na dysku znaleźć ten plik, otworzyć... A sam praser bardzo szybko prasuje. Ja zalecam nie baczenia na optymalizacje, bo nic tu nikt nie zdziała za wiele. Include proszę raczej stosować dla wygody, by nie szukać procedury X w kodzie 500kB :]

Moja rada: Lepiej jeden include niż dwadzieścia.

Ponadto co tam.... użyj microtime i sam potestuj opcje. Bo może my Cię kłamiemy i wkręcamy ;)


Jeżeli gdziekolwiek znajdzie się błąd, parser wywali błąd parse error, nawet w instrukcji warunkowej Teraz to sprawdziłem i ... faktycznie masz rację !!! ... a byłem pewien że tak nie jest, bo wydawało mi się że kiedyś zapomniałem w else średnika (albo jakiś inny błąd, ale już nie pamiętam :P) i wywaliło mi błąd dopiero wtedy gdy warunek if-a sie nie zgadzał. Czyli nawet za pomocą if-ów nie da się tak zrobić żeby funkcje były definiowane wybiórczo jedyne co można zrobić to includować pliki z funkcjami


Jeśli już to:
function DefiniujBlokFunkcji() { function A() {} function B() {} }

to akurat też nic nie zmienia ;] ... bo i tak przy definicji funkcji DefiniujBlokFunkcji zostaną zdefiniowane funkcja A i B (nie będzie ich można co prawda uruchomić przed uruchomieniem funkcji DefiniujBlokFunkcji ale będą one sprawdzane :P)

Istnieje takie coś jak dynamiczne includowanie, opisane na jednym z polskich serwisów poświęconych php albo forum (nie pamiętam którym). Dynamiczne includowanie polega na tym że pisze się kod który będzie includował w trakcie wykonywania daną funkcję kiedy zostnie użyta po raz pierwszy.

Edytka: znalazłem :D polecam lekture tego wątku:
http://forum.php.pl/...der-t26107.html
Użytkownik NeVeS edytował ten post 28 lipiec 2007, 12:53
Szukanie optymalizacji w takich miejscach jest właściwie bezcelowe. Dobrze skonfigurowany serwer mający eAcceleratora czy Zend Optimizera zręcznie sobie sam z takim czymś poradzi. Polecam użycie profilowania w xdebug2, zęby zobaczyć, gdzie jest wąskie gardło aplikacji.

@NeVeS: autoloader działa z klasami, a i tak zwykle sprowadza się to do wczytania osobnego pliku dla osobnej klasy. Ten mechanizm zdaje mi się jakoś znacząco na czas ładowania nie powinien wpływać.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.