Этот вопрос касается механизма синтаксического анализа 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 (). Надеюсь, это поможет!