/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Kan det betale sig at bruge include i en i~
Fra : Mads Horndrup


Dato : 19-01-10 15:26

Hejsa.

Kan det betale sig at have denne kode:

<?php include("file includes/eksempel.php"); ?>


Hvor eksempel.php ser sådan her ud:

kage-kage-kage
<?php include("file includes/pandekage.php"); ?>


Altså: Kan jeg have en include file, inden i en file der allerede
er included et sted?
Vil det få min side at loade langsommere?

-Mads


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Mads Horndrup (19-01-2010)
Kommentar
Fra : Mads Horndrup


Dato : 19-01-10 15:31

..og loader siden langsommere hvis jeg har for mange includes?


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (19-01-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 19-01-10 16:36

Mads Horndrup skrev:

> Kan det betale sig at have denne kode:

> <?php include("file includes/eksempel.php"); ?>

Lav koden så den er overskuelig og nem at vedligeholde. Sæt
spekulationer over hastighed langt ned på din prioritetsliste.

Indlejrede includes kan godt give mening hvis man har flere
undermoduler der f.eks. deler en stribe funktioner..

Brug include_once(). Så kan du kalde et modul flere gange uden at
der inkluderes mere end nødvendigt.

> Vil det få min side at loade langsommere?

Fisk.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Birger Sørensen (19-01-2010)
Kommentar
Fra : Birger Sørensen


Dato : 19-01-10 17:11

Mads Horndrup skrev den 19-01-2010:
> Hejsa.
>
> Kan det betale sig at have denne kode:
>
> <?php include("file includes/eksempel.php"); ?>
>
>
> Hvor eksempel.php ser sådan her ud:
>
> kage-kage-kage
> <?php include("file includes/pandekage.php"); ?>
>
>
> Altså: Kan jeg have en include file, inden i en file der allerede
> er included et sted?
> Vil det få min side at loade langsommere?
>
> -Mads

Hvad mener du med, om det kan betale sig?

Hvis din index f.eks. includerer en fil der behandler menuer og
menuvalg, kan du i den sagtens have en include, der henter data for det
aktuelle menuvalg.
Så Ja - du kan godt. Men om det er overskueligt og besparende er nok et
andet spørgsmål.

Det har nok virkning på hastigheden - men man skal nok måle den i
millisekunder, så det er ikke noget man behøver prioritere særlig højt.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Peter Farsinsen (19-01-2010)
Kommentar
Fra : Peter Farsinsen


Dato : 19-01-10 18:45

Mads Horndrup wrote:

> Altså: Kan jeg have en include file, inden i en file der allerede
> er included et sted?
> Vil det få min side at loade langsommere?

Fyr den af og gør, hvad der passer dig bedst. Så længe du kan finde en
evt. fejl er der ingen problemer.

Hvis hastigheden bliver et problem, bør du kigge på caching af
resultatet af dine scripts.

Desuden mener jeg, du bør bruge require_once() i stedet for include().
require() og require_once() smider en fatal error, hvis filen ikke
findes (så afviklingen stopper helt), hvilket ikke er tilfældet med
include() og include_once() - de smider bare en fejl, men afvikler så
resten af dit script. Hvis en fil mangler, kan det næppe være meningen
at scriptet skal fortsætte med at afvikles.

- Peter


Johan Holst Nielsen (19-01-2010)
Kommentar
Fra : Johan Holst Nielsen


Dato : 19-01-10 20:48

Peter Farsinsen wrote:
> Mads Horndrup wrote:
>
>> Altså: Kan jeg have en include file, inden i en file der allerede
>> er included et sted?
>> Vil det få min side at loade langsommere?
>
> Fyr den af og gør, hvad der passer dig bedst. Så længe du kan finde en
> evt. fejl er der ingen problemer.
>
> Hvis hastigheden bliver et problem, bør du kigge på caching af
> resultatet af dine scripts.
>
> Desuden mener jeg, du bør bruge require_once() i stedet for include().
> require() og require_once() smider en fatal error, hvis filen ikke
> findes (så afviklingen stopper helt), hvilket ikke er tilfældet med
> include() og include_once() - de smider bare en fejl, men afvikler så
> resten af dit script. Hvis en fil mangler, kan det næppe være meningen
> at scriptet skal fortsætte med at afvikles.

Man skal dog være opmærksom på der kan være et issue omkring
performance, når man leger med include_once og require_once - det er
ikke det bedste rent performancemæssigt, hvis vi taler om store systemer
med mange inkluderede filer (hvilket jeg dog ikke tror er tilfældet i
denne sag!). Så det er skidt at vende sig til at bruge den, hvis der
ikke er en årsag (hvilket der sjældnet bør være!).

I systemer hvor der inkluderes rigtig mange filer kan der komme en
*betydelig* performanceoptimering, blot ved at rette alle require_once
(eller include_once) til require (eller include).

Mvh
Johan


Peter Farsinsen (19-01-2010)
Kommentar
Fra : Peter Farsinsen


Dato : 19-01-10 22:26

Johan Holst Nielsen wrote:
>> Desuden mener jeg, du bør bruge require_once() i stedet for include().
>> require() og require_once() smider en fatal error, hvis filen ikke
>> findes (så afviklingen stopper helt), hvilket ikke er tilfældet med
>> include() og include_once() - de smider bare en fejl, men afvikler så
>> resten af dit script. Hvis en fil mangler, kan det næppe være meningen
>> at scriptet skal fortsætte med at afvikles.
>
> Man skal dog være opmærksom på der kan være et issue omkring
> performance, når man leger med include_once og require_once - det er
> ikke det bedste rent performancemæssigt, hvis vi taler om store systemer
> med mange inkluderede filer (hvilket jeg dog ikke tror er tilfældet i
> denne sag!). Så det er skidt at vende sig til at bruge den, hvis der
> ikke er en årsag (hvilket der sjældnet bør være!).
>
> I systemer hvor der inkluderes rigtig mange filer kan der komme en
> *betydelig* performanceoptimering, blot ved at rette alle require_once
> (eller include_once) til require (eller include).

Det er rigtigt. Nu har jeg desværre ikke lige et link til kilden, men
har læst en blog post om der nærmest intet overhead er, hvis man bruger
f.eks. APC. Det virker ret sandsynligt at man vil gøre det, hvis man
inkluderer mange filer.

- Peter

Mads Horndrup (19-01-2010)
Kommentar
Fra : Mads Horndrup


Dato : 19-01-10 21:21

Tak for alle svarene.
Det endte med at jeg gjorde sådan her:
<?php include("file includes/head.php"); ?>

<?php include("file includes/body_start.php"); ?>
<?php include("file includes/menu.php"); ?>
<?php include("file includes/artikel_start.php"); ?><?php include("file
includes/forside.php"); ?>
<?php include("file includes/artikel_end.php"); ?>
<?php include("file includes/sidefod.php"); ?>
<?php include("file includes/body_end.php"); ?>

Da det siger mig mest.
Jeg ved godt at jeg ikke behøvede at include forside.php (kunne bare ha'
skrevet den direkte) men det her foretrækker jeg da jeg ikke får pillet
ved noget så der opstår fejl :)

Siden er på horndrup.eu/lalala.php hvis i vil se virkningen (;

-Mads

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Chano Andersen (23-01-2010)
Kommentar
Fra : Chano Andersen


Dato : 23-01-10 19:38

Mads Horndrup skrev:
> Tak for alle svarene.
> Det endte med at jeg gjorde sådan her:
> <?php include("file includes/head.php"); ?>
>
> <?php include("file includes/body_start.php"); ?>
> <?php include("file includes/menu.php"); ?>
> <?php include("file includes/artikel_start.php"); ?><?php include("file
> includes/forside.php"); ?>
> <?php include("file includes/artikel_end.php"); ?>
> <?php include("file includes/sidefod.php"); ?>
> <?php include("file includes/body_end.php"); ?>

Hvorfor alle de PHP blokke? Følgende vil være langt mere læseligt:

<?php
include("file includes/head.php");
include("file includes/body_start.php");
include("file includes/menu.php");
include("file includes/artikel_start.php");
include("file includes/forside.php");
include("file includes/artikel_end.php");
include("file includes/sidefod.php");
include("file includes/body_end.php");
?>

I øvrigt er det ikke en god idé med mellemrum i fil og mappenavne. Det
risikere bare at give en masse bøvl.

- Chano Andersen

Bertel Lund Hansen (24-01-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-01-10 01:33

Chano Andersen skrev:

> Hvorfor alle de PHP blokke? Følgende vil være langt mere læseligt:

Ligger Dennis Munding i dit killfilter?

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Philip Nunnegaard (24-01-2010)
Kommentar
Fra : Philip Nunnegaard


Dato : 24-01-10 21:34

Bertel Lund Hansen skrev:

> Ligger Dennis Munding i dit killfilter?

OK! Stofanet-indlæggene igen.

Både dit og Dennis Mundings indlæg er også først dukket op hos mig nu.

--
Philip - http://www.chartbase.dk | http://www.hitsurf.dk

Bertel Lund Hansen (25-01-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-01-10 00:07

Philip Nunnegaard skrev:

> > Ligger Dennis Munding i dit killfilter?

> OK! Stofanet-indlæggene igen.

Åh ja, selvfølgelig.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Erik Ginnerskov (27-01-2010)
Kommentar
Fra : Erik Ginnerskov


Dato : 27-01-10 13:03

Bertel Lund Hansen wrote:
> Philip Nunnegaard skrev:
>
>>> Ligger Dennis Munding i dit killfilter?
>
>> OK! Stofanet-indlæggene igen.
>
> Åh ja, selvfølgelig.

Brug dog news.dotsrc.org, så er I ude over det problem. Det er jo ikke
første gang, Stofa har problemer med opdateringen.

--
Med venlig hilsen
Erik Ginnerskov
http://ginnerskov.dk - http://html-faq.dk



Bertel Lund Hansen (27-01-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-01-10 13:48

Erik Ginnerskov skrev:

> Brug dog news.dotsrc.org, så er I ude over det problem. Det er jo ikke
> første gang, Stofa har problemer med opdateringen.

news.stofanet.dk har haft færre problemer end news.dotsrcorg.sk.
Jeg regner dem dog begge for suveræne newsservere.

Jeg tænker som så at når jeg har adgang til en god newserver via
mit abonnement, så er der ingen grund til at belaste en gratis
tjeneste.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Bertel Lund Hansen (27-01-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-01-10 14:52

Bertel Lund Hansen skrev:

> news.dotsrcorg.sk.

news.dotsrc.org

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Chano Andersen (05-02-2010)
Kommentar
Fra : Chano Andersen


Dato : 05-02-10 22:01

Den 24-01-2010 01:32, Bertel Lund Hansen skrev:
> Chano Andersen skrev:
>
>> Hvorfor alle de PHP blokke? Følgende vil være langt mere læseligt:
>
> Ligger Dennis Munding i dit killfilter?
>

For at være ærlig, så ved jeg faktisk ikke hvor den funktion findes i
Thunderbird. Så det er nok nærmere det andetsteds omtalte stofanet problem.

- Chano Andersen

Dennis Munding (22-01-2010)
Kommentar
Fra : Dennis Munding


Dato : 22-01-10 00:58

Hej Mads!

Mads Horndrup skrev...
> Tak for alle svarene.
> Det endte med at jeg gjorde sådan her:
> <?php include("file includes/head.php"); ?>
>
> <?php include("file includes/body_start.php"); ?>
> <?php include("file includes/menu.php"); ?>
> <?php include("file includes/artikel_start.php"); ?><?php include("file
> includes/forside.php"); ?>
> <?php include("file includes/artikel_end.php"); ?>
> <?php include("file includes/sidefod.php"); ?>
> <?php include("file includes/body_end.php"); ?>

Hvis du helt bogstaveligt har en fil, der ser ud som ovenstående, så kan jeg
spare dig for lidt kode...:

<?php
include("file includes/head.php");
include("file includes/body_start.php");
include("file includes/menu.php");
include("file includes/artikel_start.php");
include("file includes/forside.php");
include("file includes/artikel_end.php");
include("file includes/sidefod.php");
include("file includes/body_end.php");
?>

Det vil give samme resultat.
Er ikke så meget inde i php, at jeg ved, om det kan komprimeres yderligere,
men det er der sikkert en anden, der ved...


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


Erik Ginnerskov (27-01-2010)
Kommentar
Fra : Erik Ginnerskov


Dato : 27-01-10 13:00

Dennis Munding wrote:

> Hvis du helt bogstaveligt har en fil, der ser ud som ovenstående, så
> kan jeg spare dig for lidt kode...:
>
> <?php
> include("file includes/head.php");
> include("file includes/body_start.php");
> include("file includes/menu.php");
> include("file includes/artikel_start.php");
> include("file includes/forside.php");
> include("file includes/artikel_end.php");
> include("file includes/sidefod.php");
> include("file includes/body_end.php");
> ?>
> Det vil give samme resultat.
> Er ikke så meget inde i php, at jeg ved, om det kan komprimeres
> yderligere, men det er der sikkert en anden, der ved...

Det er vist så meget, som det kan komprimeres. Men du har ret, der er ikke
nogen grund til at lukke php ned efter hver enkelt include og så genåbne php
for næste include.

--
Med venlig hilsen
Erik Ginnerskov
http://ginnerskov.dk - http://html-faq.dk



Chano Andersen (05-02-2010)
Kommentar
Fra : Chano Andersen


Dato : 05-02-10 22:00

Den 22-01-2010 00:58, Dennis Munding skrev:
> Er ikke så meget inde i php, at jeg ved, om det kan komprimeres
> yderligere, men det er der sikkert en anden, der ved...

Eneste mulighed for at pakke det mere sammen ville være at fjerne
linjeskift, eller se om man kan inkludere nogle af tingene i en af de
andre filer.

- Chano Andersen

Daniel Egeberg (19-01-2010)
Kommentar
Fra : Daniel Egeberg


Dato : 19-01-10 17:30

On Jan 19, 3:25 pm, Mads Horndrup <madshornd...@gmail.com> wrote:
> Hejsa.
>
> Kan det betale sig at have denne kode:
>
> <?php include("file includes/eksempel.php"); ?>
>
> Hvor eksempel.php ser s dan her ud:
>
> kage-kage-kage
> <?php include("file includes/pandekage.php"); ?>

Om det kan betale sig afhænger jo af hvad du prøver på at gøre. Det er
lidt svært at sige ud fra dit eksempel. Hvis det giver en logisk
inddeling og strukturering i din kode, så vil jeg mene at det sagtens
kan betale sig.

> Alts : Kan jeg have en include file, inden i en file der allerede
> er included et sted?

Man kan sagtens have includes inde i "includede" filer. Det PHP gør er
ikke andet end at tage koden i filen og "indsætte" den i den anden fil
før den bliver eksekveret. Fra PHPs synspunkt er der altså ingen
forskel på om din kode ligger i en fil du includer eller om den står
direkte i din anden fil (så længe filen altså findes).

> Vil det få min side at loade langsommere?

Disk I/O er generelt langsomt, så jo flere gange du skal have fat i
ting på din harddisk i runtime, jo langsommere bliver dit program. Så
ja, jo flere includes, jo langsommere bliver det. Det er dog
formentlig ikke noget der vil have særligt stor betydning for dig med
mindre du har en side med rigtigt meget traffik. Et kald til
include_once vil også være langsommere end include (tilsvarende for
require_once or require) da den skal hold en liste over alle includede
filer og tjekke den først.

En opcode cache som APC hjælpe mod begge ting. Når PHP har parset et
stykke kode får den nogle opcodes som er instruktioner til PHPs kerne
(Zend Engine/ZE). Det en opcode cache gør at den gemmer resultatet
dette i hukommelsen, som er meget hurtigere at læse fra og skrive til
end harddisken. Det betyder at hvis du ikke har ændret i din fil, så
behøver filen ikke at blive indlæst og parset igen; den kan bare
hentes direkte fra hukommelsen. APC giver dig også mulighed for helt
at springe harddisken over (så den slet ikke undersøger om filerne er
blevet ændret). Det betyder dog at du skal genstarte din webserver (og
miste din cache!) hver gang du ændrer dine filer.

Generelt er det altid anbefalet et køre APC (eller tilsvarende) i et
produktionsmiljø og det kan give performance forbedringer på op til
flere størrelsesordener.

Bottom line: Du behøver generelt ikke at bekymre dig om at have for
mange includes eller requires. Du vinder meget mere ved at have
overskuelig og velstruktureret kode end hvad du måtte miste i
performance, og hvis du endelig har nok traffik til at det har
betydning så vil APC ordne det meste.

Birger Sørensen (20-01-2010)
Kommentar
Fra : Birger Sørensen


Dato : 20-01-10 07:19

Daniel Egeberg:
8X
> Man kan sagtens have includes inde i "includede" filer. Det PHP gør er
> ikke andet end at tage koden i filen og "indsætte" den i den anden fil
> før den bliver eksekveret. Fra PHPs synspunkt er der altså ingen
> forskel på om din kode ligger i en fil du includer eller om den står
> direkte i din anden fil (så længe filen altså findes).
8X


http://dk2.php.net/manual/en/function.include.php :
"When a file is included, parsing drops out of PHP mode and into HTML
mode at the beginning of the target file, and resumes again at the end.
..."

Det er "resultatet" af den includede fil der indsættes - ikke filen
selv.
Ellers ganske enig.

Birger.

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Daniel Egeberg (20-01-2010)
Kommentar
Fra : Daniel Egeberg


Dato : 20-01-10 03:51

On Jan 20, 7:18 am, Birger Sørensen <s...@bbsorensen.com> wrote:
> Daniel Egeberg:
> 8X> Man kan sagtens have includes inde i "includede" filer. Det PHP gør er
> > ikke andet end at tage koden i filen og "indsætte" den i den anden fil
> > før den bliver eksekveret. Fra PHPs synspunkt er der altså ingen
> > forskel på om din kode ligger i en fil du includer eller om den står
> > direkte i din anden fil (så længe filen altså findes).
>
> 8X
>
> http://dk2.php.net/manual/en/function.include.php:
> "When a file is included, parsing drops out of PHP mode and into HTML
> mode at the beginning of the target file, and resumes again at the end.
> .."
>
> Det er "resultatet" af den includede fil der indsættes - ikke filen
> selv.
> Ellers ganske enig.
>
> Birger.

Ja, jeg kunne måske godt have forklaret det bedre. Det er klart at den
selvfølgelig ikke bare copy-paster koden ind i den anden fil. Det der
sker når PHP møder et include/require(_once) er at compile_filename()
i ZE bliver kaldt. Den includede fil vil så overtage både EG
(symbol_table) og EG(active_symbol_table), der er hashtabeller som
indeholder symbolnavne i hhv. det globale og lokale virkefelt (så man
kan sige at den bare arbejder videre). Når PHP starter med at parse en
fil starter den altid uden for "PHP mode" så den smider bare alt hvad
den møder indtil den kommer til "<?php" til STDOUT, og det er sådan
set bare det dit citat fra manualen mener. Når den er færdig med den
includede fil fortsætter den fra hvor den slap.

Så ja, det er sådan set "resultatet" du får igen, men jeg synes det
giver fint mening rent kognitivt at hvis man har følgende to filer:

fil1.php:
<?php
$foo = 'bar';
include 'fil2.php';
?>

fil2.php:
<?php
echo $foo;
?>

Så har du *reelt* følgende:
<?php
$foo = 'bar';
echo $foo;
?>

Eller for at være helt nøjagtig når nu den starter uden for "PHP
mode":
<?php
$foo = 'bar';
?><?php
echo $foo;
?><?php ?>

Den vigtige pointe er selvfølgelig at du i løbet af dette vil få en
række opcodes i den inkluderede fil og hvis du kører APC så kan den
cache disse. Dvs. at næste gang du inkluderer den, så kan den bare
hente disse opcodes og bruge dem direkte.

Mht. opcode caching kan jeg nævne at jeg driver en "mellemstor" side
og her bliver opcode cachen ramt ca. 52 gange hvert sekund. Det er
altså 52 gange i sekundet at PHP slipper for at parse en masse filer
om og om igen. Står man med en side om Facebook bliver gevinsten
naturligt meget større.

--
Daniel Egeberg
degeberg@php.net

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste