Является ли тот же файл символизирован каждый раз, когда я его включаю?

Этот вопрос касается механизма синтаксического анализа PHP.

Когда я включаю файл несколько раз за одну рабочую среду, PHP каждый раз его токенизирует или хранит кеш и просто запускает скомпилированный код при последующих включениях?

EDIT: Более подробно: я не использую внешний механизм кэширования, и я имею дело с тем же файлом, который включается несколько раз во время одного и того же запроса .

EDIT 2: файл, который я пытаюсь включить, содержит процедурный код. Я хочу, чтобы он выполнялся каждый раз, когда я include() , мне просто интересно, если PHP внутренне отслеживает токенизированную версию файла по причинам скорости.

По умолчанию файл анализируется каждый раз, когда он включен (действительно), даже в пределах одного и того же экземпляра php. Но есть кеши кода операции, например, apc

  <? PHP
 $ i = 'include_test.php'; 
file_put_contents ($ i, '<? php $ x = 1;'); включают $ i; echo $ x, '';
file_put_contents ($ i, '<? php $ x = 2;'); включают $ i; echo $ x, ''
  1 2 

(нормально, слабое доказательство, PHP может проверить, изменилось ли время mtime файла.И это то, что делает apc, я думаю, но без кеша PHP действительно не работает)

Вы должны использовать кеш байт-кода PHP, такой как APC. Это выполнит то, что вы хотите, повторно использовать скомпилированную версию страницы PHP для последующих запросов. В противном случае PHP читает файл, выполняет токенизацию и компилирует его по каждому запросу.

Посмотрите на include_once () . Он будет включать его снова.

Также, если вы используете объекты. Посмотрите на __autoload ()

Я просто написал базовый тест, похожий на VolkerK. Вот что я тестировал:

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

Это вызвало следующее:

 0 1 2 3 4 5 12 14 16 18 

Таким образом, если он не кэшируется на основе mtime файла, кажется, что он анализирует каждый из них. Вероятно, вы захотите использовать include_once () вместо стандартного include (). Надеюсь, это поможет!