Hvornår indlæses en funktioner i PHP?

Tags:    php teoretisk

Hej.

Jeg har tænkt lidt over, om der er nogle der ved, hvornår funktionerne i PHP rent faktisk indlæses. Indlæses de først når de bliver kaldt eller indlæses de ligeså snart man inkludere funktionsdokumentet på ens side?

På forhånd tak for hjælpen :).



Indlæg senest redigeret d. 03.06.2013 17:01 af Bruger #14776
9 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 29 karma
Sorter efter stemmer Sorter efter dato
PHP læser fra top til bund i et dokument, så hvis du har en include funktion.php øverst i dokumentet så bliver den indlæst med det samme, men den udfører først funktionen når den bliver kaldt



Vil det så betyde, at i teorien, så er det en meget dum idé, at have et enkelt dokument til alle sine funktioner og så i stedet have en milliard sider med hver deres funktion?


Ikke nødvendigvis. Zend (som er PHPs execution engine) cacher oversættelsen, så når din kode én gang er indlæst og oversat til native maskinkode, så sker det ikke igen før du ændrer i koden.




Vil det så betyde, at i teorien, så er det en meget dum idé, at have et enkelt dokument til alle sine funktioner og så i stedet have en milliard sider med hver deres funktion?


Der er flere årsager til at det er en dårlig ide at have alle sine funktioner samlet i én fil. Det er i en god ide at samle relaterede funktioner i en samlet fil eller i en klasse. Ellers bliver projektet meget hurtigt uoverskueligt. Hvis man er flere der arbejder på det samme projekt, er det i sær irriterende hvis man har sådan en stor central fil med funktioner.



PHP læser fra top til bund i et dokument, så hvis du har en include funktion.php øverst i dokumentet så bliver den indlæst med det samme, men den udfører først funktionen når den bliver kaldt


Vil det så betyde, at i teorien, så er det en meget dum idé, at have et enkelt dokument til alle sine funktioner og så i stedet have en milliard sider med hver deres funktion?


Det er derfor du deler dem op i klasser og laver fil navne hertil: fx "User.Class.php".
For at undgå du læser i nødvendige funktioner ind.



PHP læser fra top til bund i et dokument, så hvis du har en include funktion.php øverst i dokumentet så bliver den indlæst med det samme, men den udfører først funktionen når den bliver kaldt


Vil det så betyde, at i teorien, så er det en meget dum idé, at have et enkelt dokument til alle sine funktioner og så i stedet have en milliard sider med hver deres funktion?



I de seneste par projekter benytter jeg funktioner kun relativt sporadisk, og det disse funktioner bliver primært brugt i samme platoniske setup som Wordpress - altså som "tags".

Jeg holder klasser og filer i 1:1. En klasse, en fil. Derpå har jeg en autoloader der sikrer at kun nødvendige klasser/filer indlæses når der opstår behov. Samme mulighed er der ikke for funktioner.

Men jo flere filer der skal indlæses, jo mere IO aktivitet vil der være, og derfor kan der med en stor mængde filer være tale om længere afviklingstid. Ligeledes skal man huske at PHP indlæses til RAM før afvikling. Så jo flere linjer, jo mere RAM bruges der. Disse to ting taget i betragtning, er det altid en afvejning. Hastighed vs. letlæselighed. :)

Men! En fil med al php-kode i er absolut no-go. Det kan lade sig gøre med sådanne projekter som Adminer, eller lign. Arbejdes der med større projekter med over 10.000 linjer kode, så bør man opdele sin kode i klasser, funktioner og templates.



Det er ikke helt så enkelt Michael Larsen. Der er ikke nødvendigvis IO overhovedet.

Operativsystemet cacher al disk IO (så længe som muligt), så når en fil én gang er indlæst til hukommelsen (og cachen), så læses den ikke igen. Hvis den opdateres, så opdateres cachen samtidig, og igen behøver den ikke at blive indlæst.

Det gælder for lokal storage...ligger filerne på et netværksdrev, så er man selvfølgelig nødt til at tjekke for ændringer, men det kan være et simpelt stat systemkald (som så sker over lokalnetværket til en server, som sandsynligvis har filen i sin cache).



Indlæg senest redigeret d. 05.06.2013 10:48 af Bruger #2695
Du har sikkert ret i det teoretiske aspekt. :o)

I praksis har min oplevelses dog været at PHP og Apache ikke cacher en fløjtende fis i en alm. kendt LAMP stack. Dette har ikke været tilfældet indtil Zend, APC eller eAccelerator er bragt i spil.



Det er heller ikke hverken PHP eller Apache, som skal cache. Det er Linux/Windows (altså selve operativ systemet), og Linux gør det rigtig godt.
Efter et par dages oppetid vil din RAM ofte være helt brugt, men størstedelen er brugt på cachede filsystem blokke.



t