Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ładowanie wszystkich plików odrazu ?
darektbg
post 8.11.2006, 15:11:13
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 25.09.2006

Ostrzeżenie: (0%)
-----


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


--------------------
skocz.org - system skracania linków
Go to the top of the page
+Quote Post
siemakuba
post 8.11.2006, 16:36:02
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
dr_bonzo
post 8.11.2006, 16:49:36
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
siemakuba
post 8.11.2006, 18:11:09
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 00:45