Tutorial :Is the same file tokenized every time I include it?



Question:

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.


Solution:1

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)


Solution:2

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.


Solution:3

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

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


Solution:4

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!


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »