Является ли PHP дорогим (особенно во время итераций)? - PullRequest
14 голосов
/ 23 июня 2011

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

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

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

Это кеш? Будет ли это влиять на производительность? Это считается хорошей практикой? Bad

В ответ на ответ Аарона Мюррея

Нет, это не сработает. Простая концепция _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;

Ответы [ 3 ]

7 голосов
/ 23 июня 2011

Кеширует ли 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;
5 голосов
/ 23 июня 2011

Рассматривали ли вы:

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;
}
2 голосов
/ 23 июня 2011

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

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

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

...