Один и тот же файл размечается каждый раз, когда я его включаю? - PullRequest
2 голосов
/ 30 апреля 2009

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

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

РЕДАКТИРОВАТЬ: Более подробно: я не использую внешний механизм кэширования, и я имею дело с одним и тем же файлом, включаемым несколько раз во время одного и того же запроса .

РЕДАКТИРОВАТЬ 2: Файл, который я пытаюсь включить, содержит процедурный код. Я хочу, чтобы он выполнялся каждый раз, когда я include(), мне просто любопытно, если PHP внутренне отслеживает токенизированную версию файла по соображениям скорости.

Ответы [ 4 ]

2 голосов
/ 30 апреля 2009

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

1 голос
/ 30 апреля 2009

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

<?php
$i = 'include_test.php';<br>
file_put_contents($i, '<?php $x = 1;');
include $i;
echo $x, ' ';<br>
file_put_contents($i, '<?php $x = 2;');
include $i;
echo $x, ' '
1 2
(хорошо, слабое доказательство. PHP может проверить, изменился ли файл mtime. И это то, что делает apc, я думаю. Но без кеша PHP действительно не делает)
1 голос
/ 30 апреля 2009

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

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

0 голосов
/ 30 апреля 2009

Я только что написал базовый тест, очень похожий на тест 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 />"; ?>');
    }
}

?>

Это породило следующее:

0
1
2
3
4
5
12
14
16
18

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...