2009-04-30 10 views
2

Cette question concerne le moteur d'analyse PHP.Le même fichier est-il segmenté chaque fois que je l'inclue?

Lorsque j'insère un fichier plusieurs fois dans une seule exécution, est-ce que PHP le marque à chaque fois ou conserve-t-il un cache et exécute-t-il simplement le code compilé lors des inclusions suivantes?

EDIT: Plus de détails: Je ne suis pas au moyen d'un mécanisme de mise en cache externe et je traite avec le même fichier étant inclus plusieurs fois au cours de la même demande .

EDIT 2: Le fichier que j'essaie d'inclure contient du code procédural. Je veux qu'il soit exécuté chaque fois que je l'ai, je suis juste curieux de savoir si PHP conserve en interne la version tokenisée du fichier pour des raisons de vitesse.

Répondre

1

Par défaut, le fichier est analysé à chaque fois qu'il est (vraiment) inclus, même dans la même instance php. Mais il existe des caches d'opcode comme par ex. apc

<?php 
$i = 'include_test.php';
file_put_contents($i, '<?php $x = 1;'); include $i; echo $x, ' ';
file_put_contents($i, '<?php $x = 2;'); include $i; echo $x, ' '
1 2
(ok, preuve faible. PHP pourrait vérifier si le mtime du fichier a changé. Et que ce apc le fait, je pense. Mais sans PHP cache ne vraiment pas)

2

Vous devriez utiliser un Cache de bytecode PHP tel que APC. Cela va accomplir ce que vous voulez, pour réutiliser une version compilée d'une page PHP sur les requêtes suivantes. Sinon, PHP lit le fichier, le marque et le compile à chaque requête.

0

Je viens d'écrire un test de base, un peu comme VolkerK. Voici ce que je l'ai testé:

<?php 
file_put_contents('include.php','<?php echo $i . "<br />"; ?>'); 

for($i = 0; $i<10; $i++){ 
    include('include.php'); 
    if($i == 5){ 
     file_put_contents('include.php','<?php echo $i+$i; echo "<br />"; ?>'); 
    } 
} 

?> 

Cela a généré les éléments suivants:

0 
1 
2 
3 
4 
5 
12 
14 
16 
18 

Donc, à moins qu'il caches basé sur mtime du fichier, il semble qu'il analyse tous les comprennent. Vous voudrez probablement utiliser include_once() au lieu de include() standard. J'espère que cela pourra aider!

Questions connexes