Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ładowanie wszystkich plików odrazu ?
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
darektbg
Witam !
Spotkałem się ostatnio z pewnym frameworkiem Flex, w głównym katalogu były dwa pliki include_all.php i include_list.php :

include_all.php
  1. <?php
  2. define( FLLIB_DIR, realpath( dirname( __FILE__ )));
  3. define( FLPACKAGE_LIB, false );
  4. require_once( 'include_list.php' );
  5.  
  6. foreach( $libClass as $libPath )
  7. {
  8. if( file_exists( FLLIB_DIR . $libPath ) )
  9. {
  10. require_once( FLLIB_DIR . $libPath );
  11.  
  12. if( FLPACKAGE_LIB === true )
  13. {
  14. $cached_classes .= file_get_contents( FLLIB_DIR . $libPath );
  15. $cached_classes .= "nn"; 
  16. }
  17. }
  18. else
  19. {
  20. echo "File " . $libPath. " doesn't exists !n<br>";
  21. }
  22.  
  23. }
  24.  
  25.  
  26. if( FLPACKAGE_LIB === true )
  27. {
  28. file_put_contents( FLLIB_DIR . "/FLPackage.php", $cached_classes );
  29. }
  30.  
  31.  
  32. ?>


include_list.php
  1. <?php
  2. $libClass = array(
  3.  
  4. 'utils/FLStringUtils.class.php',
  5. 'utils/FLArrayUtils.class.php',
  6. 'utils/FLCollection.class.php',
  7. // i kolejne pliki frameworka
  8. );
  9.  
  10. ?>


Z tego wynika, że wszystkie pliki są na początku ładowane i to budzi we mnie zastrzeżenia. Czy pliki powinny być na początku od razu wszystkie ładowane czy dopiero wtedy gdy dany jest potrzebny ?

Pozdrawiam
Darektbg
siemakuba
Rozważałem kiedyś ten problem, bo też wydało mi się niezbyt dobrym pomysłem ładowanie wszystkiego jak leci. Wiele tu zależy od budowy aplikacji, rozdziału klas na pliki itp. Wiadomo, im większa funkcjonalność tym więcej pojawi się plików. Osobiście uważam, że bardziej logiczne wydaje się ładowanie plików wtedy kiedy są potrzebne i tak właśnie organizuje to u siebie. Zbudowałem sobie ku temu prosty ObjectManager, który zajmuje się dostarczaniem potrzebnych plików. Jest to klasa, w której statycznie wywołuję metodę Import, która sprawdza czy dany plik został już załadowany i w razie potrzeby ładuję odpowiedni plik.

Jedna ważna uwaga, bo wydaje mi się, że rzadko zwraca się uwagę na to. Wszystkie instrukcje require" title="Zobacz w manualu php" target="_manual czy require_once" title="Zobacz w manualu php" target="_manual znalezione w kodzie w czasie kompilacji zostaną wykonane i pliki zostaną faktycznie załączone. Nawet jeśli taka instrukcja znajduje się wewnątrz instrukcji warunkowej dla której warunek nie jest spełniony, plik zostanie faktycznie załączony. Wynika z tego, że jakiekolwiek dynamiczne ładowanie można zbudować tylko w oparciu o include" title="Zobacz w manualu php" target="_manual i include_once" title="Zobacz w manualu php" target="_manual.

Ot, moje 2 grosze :)
pozdr.
dr_bonzo
siemakuba:
Cytat
Wszystkie instrukcje require czy require_once znalezione w kodzie w czasie kompilacji zostaną wykonane i pliki zostaną faktycznie załączone. Nawet jeśli taka instrukcja znajduje się wewnątrz instrukcji warunkowej dla której warunek nie jest spełniony, plik zostanie faktycznie załączony. Wynika z tego, że jakiekolwiek dynamiczne ładowanie można zbudować tylko w oparciu o include i include_once.

Totalne bzdury:
1. w manualu pisze ze require i include zachowuja sie identycznie, rozni je jedynie typ bledu wyrzucanego w momencie nie znalezienia pliku.

2. wez sprawdz, wszystkie autoloadery przestaly by dzialac bo w nich jest kod typu:

  1. <?php
  2. require $nazwaKLasy . '.class.php'
  3. ?>


3. powiedz mi jaki plik zostanie zalaczony w czasie KOMPILACJI:
  1. <?php
  2. require $costam . '.php'
  3. ?>
?


Zaden, bo zostanie zaladowany w czasie interpretacji, bo dopiero wtedy bedzie znana wartosc zmiennej $costam


darektbg:
Masz watek o autoloaderach, chyba nawet w php Pro.

Jesli ladujesz wszystko na raz to niepotrzebnie ladujesz czesc plikow (przy zalozeniu ze nie wszystkich zawsze potrzebujesz), ale pliki ladowane od razu szybciej sie laduja
Jesli ladujesz pojedynczo, na rzadanie (autoloaderem), to tracisz czas na przelaczaniu sie php miedzy wykonywaniem skryptu a kompilacja dolaczanych plikow, ale zyskujesz przez niezalaczanie niepotrzebnych plikow.

Kompromisem zdaje sie byc (opisane przeze mnie a wykonane przez hwao -- w tamtym watku o autoloaderach) polaczenie obu rozwiazan -- na sztywno ladowanie plikow zawsze wykorzystywanych, a te zalezne od requestu ladowanie autoloaderem.
siemakuba
@dr_bonzo: no przecież nie wyssałem tego z palca...
Cytat
Notatka: Począwszy od php 4.0.2, zachowanie instrukcji jest następujące: require() będzie zawsze próbować odczytać plik docelowy, nawet jeśli linia w której ona się znajduje nigdy nie zostanie wykonana. Instrukcja warunkowa nie wpływa na działanie require(). Jednakże, jeśli linia, w której pojawia się require() nie zostaje wykonana, zawartość pliku wczytywanego też nie zostaje wykonana. Podobnie, instrukcje pętli nie wpływają na działanie require(). Chociaż kod zawarty w pliku docelowy wciąż jest podmiotem pętli, require() działa tylko raz.


Wynika z tego chyba jednoznacznie, że pliki które ładujesz przez require, require_once będą ładowane przed wykonaniem skryptu, co za tym idzie, będą ładowane bez względu na to czy są potrzebne w danym momencie czy nie są. Owszem, będzie to sprawdzanie czy plik da się załadować czy nie, a nie wykonanie kodu z dołączanego pliku, ale zawsze jest to trochę więcej działania niż robi include.

pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.