tags:

views:

103

answers:

4

This question is about the PHP parsing engine.

When I include a file multiple times in a single runtime, does PHP tokenize it every time or does it keep a cache and just run the compiled code on subsequent inclusions?

EDIT: More details: I am not using an external caching mechanism and I am dealing with the same file being included multiple times during the same request.

EDIT 2: The file I'm trying to include contains procedural code. I want it to be executed every time I include() it, I am just curious if PHP internally keeps track of the tokenized version of the file for speed reasons.

+1  A: 

Look at include_once(). It will include it again.

Also if you are using objects. Look at __autoload()

Ólafur Waage
+1  A: 

By default the file is parsed every time it is (really) included, even within the same php instance. But there are opcode caches like e.g. 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, weak proof. PHP could check whether the file's mtime has changed. And that what apc does, I think. But without a cache PHP really doesn't)

VolkerK
+2  A: 

You should use a PHP bytecode cache such as APC. That will accomplish what you want, to re-use a compiled version of a PHP page on subsequent requests. Otherwise, PHP reads the file, tokenizes and compiles it on every request.

Bill Karwin
A: 

I just wrote a basic test, much like VolkerK's. Here's what I tested:

<?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 />"; ?>');
    }
}

?>

This generated the following:

0
1
2
3
4
5
12
14
16
18

So, unless it caches based on mtime of the file, it seems it parses every include. You would likely want to use include_once() instead of standard include(). Hope that helps!

Warren Krewenki