Является ли PHP включенно дорогостоящим (особенно во время итераций)?

Запрошен ли PHP-кеш include? Мне было интересно, как очистить мой код, и я подумал об использовании немного больше includes. Рассмотрим следующую схему.

[foreach answer] [include answer.tpl.php] [/foreach]

Для этого потребуется answer.tpl.php сотни раз.

Он кэширует? Будет ли это иметь значение, влияющее на производительность? Это считается хорошей практикой? Плохо?

В ответ на @Aaron Murray ответьте

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

Практический пример будет выглядеть следующим образом:

# index.php
<?php
$array  = array('a', 'b', 'c');

$output = '';

foreach($array as $e)
{
    $output .= require_once 'test.php';
}

echo $output;

# test.php 
<?php
return $e;

Ответы

Ответ 1

Запрошен ли PHP-кеш include?

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

Если вы столкнулись с фактическими проблемами, вам сначала нужно будет профилировать приложение, чтобы узнать, где находится фактическое узкое место. Поэтому, если вы еще не столкнулись с какими-либо проблемами, я бы подумал, что использование include не вредно.

Что касается хорошей практики, я думаю, что это довольно хорошо объяснено в этой статье: Когда Flat PHP встречает Symfony.

Сделайте ваш код немного более повторно используемым

Здесь нет высокого дизайна, просто чтобы показать картинку, как вы можете начать делать вещи более модульными. Вы должны иметь возможность взять код 1:1 из вашего включенного файла, просто позаботьтесь, чтобы все необходимые переменные шаблона передавались в функцию (не используйте для этого глобальные переменные, они рано или поздно будут стоять на вашем пути):

# in your answer.tpl.php

function answer_template(array $vars) {
    extract($vars);
    ... your template code ...
}

# your script

array  = array('a', 'b', 'c');

$output = '';

require('answer.tpl.php');

foreach($array as $e)
{
    $output .= answer_template(compact('e'));
}

echo $output;

Ответ 2

Вы считали:

require_once('answer.tpl.php')
or
include_once('answer.tpl.php')

Конечно, вы можете включить "обязательные" файлы только в сценарии, в которые вы хотите включить их (только там, где они действительно нужны).

Изменить: обновленный ответ:

index.php →

require_once('answer.php');
echo answer(); // This function can be called from anywhere in the scripts.

answer.php →

function answer() {
    return '<div>This is the answer</div>';
}

Также на боковой ноте вы можете использовать буферизацию вывода в своей функции для захвата HTML (немного более чистого метода для разделения HTML и php) в вашем answer.php.

В ответ на ваш пример выше:

index.php

<?php
require_once('test.php');
$array  = array('a', 'b', 'c');
$output = '';
foreach($array as $e)
{
    $output .= test($e);
}
echo $output;

test.php

<?php
    function test($param) {
    return $param;
}

Ответ 3

Этот вопрос появился раньше, так что вот некоторые потенциальные дубликаты (не одобряющие никаких, в основном частичные ответы, но, тем не менее, релевантные):

Ну, никто из них не отвечает на ваш вопрос. У нас был небольшой показатель производительности где-то, но я не могу его найти.

(Лично я часто делаю orginize мой код, чтобы объединить все приложение в один файл blob, а затем разделите пробелы, чтобы избежать множественного доступа к файлам, даже если есть APC.)